2008-06-01から1ヶ月間の記事一覧

お休み

再び東京に戻ることになりました。 明日荷物を送ってしまうのでしばらく作業できません。 こっちにいる間はネットを使えますが、引越し先で使えるようになるまで少し時間がかかるので、しばらくネットなし生活になりそうです。 まぁ、携帯から更新できなくも…

optional_iteratorの除去

逆アセンブルリストを比較しているとインライン化の妨げになっているようだったので、optional_iteratorを使わないようにしました。 差分 COWベースのstring_list(注:名前はlistだけど実体はvector)で、リストが空でvectorが作成されていない状態のbegin()/e…

BOOST_SPIRIT_USE_LIST_FOR_TREES

マクロBOOST_SPIRIT_USE_LIST_FOR_TREESを定義した場合にコンパイルできない問題だけ修正しました。 差分 通常、Boost.Spiritの構文木は、 template<class T> struct tree_node { typedef std::vector<tree_node<T> > children_t; T value; children_t children; }; のような構造体</tree_node<t></class>…

続々 ドキュメントのビルド方法

FOPの説明を追加しました。 http://hamigaki.sourceforge.jp/doc/html/installation/documents.html ついでにindex.htmlにWeb上の「ドキュメントのビルド方法」へリンクを張っておきました。 これでビルド方法を調べるためにビルドしなければいけない問題も…

続 ドキュメントのビルド方法

ツールセットのオプションについての説明を追加しました。 http://hamigaki.sourceforge.jp/doc/html/installation/documents.html あとFOPの説明が抜けてます。

ドキュメントのビルド方法

ドキュメントのビルド方法について、必要最低限のことだけドキュメントに追加しました。 http://hamigaki.sourceforge.jp/doc/html/installation/documents.html あー、これを読むためにはドキュメントのビルドが必要でした、、、。 TODO: 設定の詳細追加 re…

パースエラー

今日は全然縮まなかったので、以前デバッグ中に見つけたクラッシュするパターンを調査しました。 原因はデバッガで覗くとすぐに判明。include文で読み込んだjamファイルのパースが成功したかどうかチェックしていないだけでした。 とりあえず適当な例外を投…

Re: bjam高速化 その5

string_listの要素アクセスで、 const std::string& string_list::operator[](size_type n) const { if (n < size()) return (*pimpl_)[n]; else return dummy; } みたいなことをしていると勘違いして、ループ内部でアクセスする場合にサイズチェックが無駄…

bjam高速化 その8

今日も測定に時間がかかってあまり進んでません。 ローカル変数は「値の設定時に古い値を取っておいて、後で元に戻す」ことで実装しているのですが、元に戻す際にmapを探索するのが無駄なのでポインタを覚えて置くようにしました。 差分 実行時間はこうなり…

bjam高速化 その7

TICKを仕込む範囲を狭めていって、コードを調べていたところ、変数の展開処理に明らかな無駄があったので修正しました。 差分 jam言語の変数展開では修飾子によって変数の値を加工できるため、変数展開の度に文字列リストを生成していたのですが、 X = $(HOG…

bjam高速化 その6

Hamigaki.Bjamでは組み込みルールを自分で追加できるので、これを使ってjamファイルの計測をしてみました。 namespace bjam = hamigaki::bjam2; bjam::string_list tick(bjam::context& ctx) { std::cout << ::GetTickCount() << std::endl; return bjam::st…

bjam高速化 その5

今日は単純なループの手抜きを直しました。 差分 for (std::size_t i = 0; i < vec.size(); ++i) ... を for (std::size_t i = 0, size = vec.size(); i < size; ++i) ... に変えただけです。 「STLアルゴリズムを使え!」という感じですが、途中で抜ける条…

bjam高速化 その4

文字列キャッシュを作ろうと思ったんですけど、bjamのソースを見るとBoost.Flyweight同様に一旦文字列をコピーしているようで、あまり効果がないかもしれず取りやめました。 結局、今日はほんの少ししか改善できませんでした。 差分 う〜ん、後は片っ端から…

Boost SVN r45117 対応

Boost.Flyweightビルド時にコンパイルが通らず、久々にsvn updateしたらexec.jamが動かなくなっていたので直しておきました。 差分 importを追加しただけです。 ルールを別モジュールにIMPORTした場合、そのルールはIMPORT先のモジュール内で動作するため、…

bjam高速化 その3

文字列をキャッシュしてどれくらい速くなるかのテストとして、文字列リスト(hamigaki::bjam2::string_list)の要素をBoost.Flyweightに差し替えてみました。(参考: wikipedia:Flyweight パターン) まだSVN trunkにコミットされていない キャッシュは静的変数…

bjam高速化 その2

今日もいくつか変更を加えたんですが、実行時間は誤差程度しか変化ありませんでした。 プロファイリングの上位にある関数に手を加えてもあまり変わらないということは、ボトルネックの部分がインライン化されて多くの関数に分散しているということかもしれま…

timeもどき

なんかCygwin bashのtimeコマンドがまともな結果を返さないので、自分で作りました。 エラーチェックがテキトーとか、分の表示が0固定とか、やっつけコードですが、貼っときます。 #include <stdio.h> #include <stdlib.h> #include <windows.h> FILETIME diff_time(const FILETIME* lhs, c</windows.h></stdlib.h></stdio.h>…

bjam高速化 その1

Windows版もSolaris版の速度に近づいてきたので、今日はSolarisでのプロファイリング結果を参考にしながら高速化していました。 skip_parserをruleを使わない独自実装に置き換えた expand_variable()で直積を作る必要がない場合に関数を中断するように変更 t…

_SECURE_SCL

VC++用のまともなプロファイラが手元にないので、結果に影響ない範囲で同じ関数を二度呼ぶ手法で所要時間の概算を調査しています。 例えばnew/deleteの時間を測るには、 #include <new> #include <cstdlib> void* operator new(std::size_t size) throw(std::bad_alloc) { </cstdlib></new>…

file_status_cache

boost::filesystem::statusとディレクトリリストをキャッシュするfile_status_cacheを実装してみました。 今日の差分 このキャッシュは期限も容量制限もなく、単に蓄積されます。 更新時間のチェックもしていないので、bjam実行中に追加や削除が行われても反…

プロファイリングしてみた

ぱっと見で速くなりそうなところを直したところで、Solarisでプロファイリングしてみました。 Linuxを使わなかったのは、プロファイリング用にビルドされたバイナリがFedoraのパッケージにはなさそうだったからで、Solaris(Nexenta)ではソースからビルドする…

no_node_d

プロファイルを取るまでもなく、明らかに速くなりそうだったので、Boost.Spiritのno_node_dディレクティブを使って、構文木から余分なノードを削除してみました。 差分 ver 時間 v1 87.500秒 v2 70.734秒 no_node_d 56.609秒 結構減りました。 この調子なら…