路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

xml.dom.minidomの勉強

2009-12-22 13:29:31 | プログラミング
緩い解析でいいので、minidomで手を抜くことを考えます。

とりあえず、xmlファイルを読んでタグ名(要素名)と属性名を印字するプログラムを習作。

-----------------------------
import xml.dom.minidom as minidom

def dom_walk(node, enter_func, exit_func, recurse_predicate):
  def dwi(node):
    enter_func(node)
    for childNode in filter(recurse_predicate, node.childNodes):
      dwi(childNode)
    exit_func(node)
  dwi(node)

if __name__ == '__main__':
  import sys
  if len(sys.argv) == 1:
    print "usage walkxml <somexmlfile.xml>"
    sys.exit(0)
  
  xmlFileName = sys.argv[1]
  dom = minidom.parse(xmlFileName)
  
  def enter_func(node):
    if node.attributes:
      print "<%s %s>" % (node.nodeName, " ".join(node.attributes.keys()))
    else:
      print "<%s>" % node.nodeName
  
  def exit_func(node):
    print "</%s>" % node.nodeName
  
  def recurse_predicate(node):
    return node.nodeName != "#text"
  
  dom_walk(dom, enter_func, exit_func, recurse_predicate)
-----------------------------

memo: サーバーガベージコレクション

2009-12-17 22:01:08 | プログラミング
IronPythonはGILフリーのマルチスレッドなので、スレッド(≠プロセス)をいっぱい使って高速化!
・・・のはずが、CPUの使用率がどうしても30%を超えません。

それもそのはず、(CPUはXeon x 2なので)16個もネイティブスレッドが使えるはずなのに、なぜか8つしか使ってくれない。

どうも、CPUが複数乗っているマシンでは、デフォルトの.Net Frameworkのガベージコレクションはあまり効率的ではないそーで。「サーバーガベージコレクションを使え」とのこと。

つまりは、アプリケーション構成ファイル(ipy64.exe.config)に、
 <runtime>
  <gcServer enabled="true" />
 </runtime>
と書き足せばよい、ということらしい。

早速やってみたところ、おー、平均96%までいきました。

これで帰れるー。

追記。

でもなぜ.Net Frameworkが勝手にONにしてくれないんでしょうか?CPUの数の検出なんか簡単だろうに。

謎。

Unladen Swallow、VS2008でビルドできてしまう

2009-12-17 19:34:24 | プログラミング
Googleグループ(という掲示板?)の"can not build on windows!"というスレッド。

http://groups.google.com/group/unladen-swallow/browse_thread/thread/fc48bc32392d799f

11月17日のポストに書いてある手順を順にやっていけば、VS 2008でコンパイルできました。

ちょっと触ってみたんですが、これがまあそこそこ動きます。驚き。

来年1月には2009Q4もリリースされるそうなので、これはぜひ追っかけよう。

IronPython trunkを試す

2009-12-16 19:50:56 | プログラミング
先日2.6 finalがリリースされたIronPythonですが、

今日changelogをみると「メタクラスを使ってないとき云々」と気になる記述が。

というわけで、最新のソースからipy.exeをビルドして試してみることにします。

やり方を以下にメモ。

---------------------------

(1) VS 2008をインストールしておく。
(2) IronPythonのソースコードをダウンロードして展開。
(3) コマンドプロンプトを開き、.slnがあるディレクトリにcd。

readme.htmlを読むと、ビルドするには、コマンドラインから、

c:¥Windows¥Microsoft.NET¥Framework¥v3.5¥MSBuild.exe IronPython.sln

とせよ、とあります。これでデバッグ版のipy.exeが作られます。

(4) 今回はリリース版を試したいので、以下のコマンドラインで。

c:¥Windows¥Microsoft.NET¥Framework¥v3.5¥MSBuild.exe /p:Configuration=Relaase

これでリリース版のipy.exeが作られます(とはいえ、デバッグ版とどこが違うのかは未検証です)。

ただし、このままだとバイナリの配布物にはついてくるPythonの標準モジュールがないので、ほぼ使えません。そこで、

(5) バイナリで配布されているIronPythonの/Libディレクトリを、先ほどビルドしたipy.exeがあるディレクトリの/Libに上書きします。

このとき、すでにある.pyファイルを上書きしないように注意してください。

---------------------------

試してみると、メタクラス云々のところを書き換えてやると(2.6 finalと比べて)パフォーマンスがちょっとだけあがりました。

やきもきさせるなー。年末なのに。

ビジーも寝るのも禁止

2009-12-14 23:25:10 | プログラミング
ビジーウェイトは論外ですけれど。

下手にウェイト(sleep()関数)を入れるのも危うい。

テスト環境ではチューニングできた思っても、CPUのパフォーマンスが全然違うところで実行したときどうなるのかよくわからない。

特にマルチコアで実行されたりすると恐ろしい。

ということで、来年リリース予定のコードから、sleep()を探し出して撲滅しました。

・・・2日もかかりましたけれども。

でもまあ、CPUの使用率が限りなく100%に近づいて、テストの実行時間も3%くらい改善して、よかったよかった。

BOF: Intel、ヘテロからホモへ揺り戻し?

2009-12-08 15:58:36 | Birds-Of-Feather
記事「Core i7より少ない電力で“48コア”SCCを動かす」
http://plusd.itmedia.co.jp/pcuser/articles/0912/03/news080.html



記事「Intel、「Larrabee」の第1弾製品の開発を中止
外付けグラフィックス製品を取りやめ、プロジェクトは継続」
http://pc.nikkeibp.co.jp/article/news/20091207/1021061/

とをあわせ読むと、

少なくとも数年はIntelからGPUっぽいものは出てこなさそう。

「シングルチップ・クラウド」じゃあんまりキャッチーじゃないと思うけどなあ。