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秒 結構減りました。 この調子なら…

構文木を作る その10

ようやくテストをパスしました。 差分 さて、速度比較のためbjam_dumpを実行してみたのですが、これがなかなか動きませんでした。 これはテストケースをもっと増やさないとダメですね。 一部、仕様(というかbjamのソース)を読み違えていたところもあって、こ…

構文木を作る その9

構文木を評価するevaluate_bjam()を作りました。 差分 実装は昨日まで使っていたテストプログラムの流用です。 これでパーサーと(狭義の)インタプリタの実装が終わったので、残りのコンポーネントも旧バージョンからコピーしてきました。 差分 現在、テスト…

構文木を作る その8

えー、昨日のエントリはなしで、、、。 matchのvalueとnode_val_dataのvalueがごっちゃになってました。 結局、Boost.Spiritの構文木の枠組みに合わせて、独自の実装を作成しました。 parse_tree.hpp parse_tree.hpp まず、node_val_dataは反復子に依存する…

構文木を作る その7

昨日の考察で結論がでたはずだったんですが、構文木に反復子を入れるとinclude文で作成する反復子を揃える必要があることを失念していました。 色々考えているうちにスキャナを弄れば行番号を埋め込ませることができそうな気がして、Boost.Spiritのコードと…

構文木を作る その6

インタプリタの実装はできました。 今日の差分 あとはこのインタプリタをライブラリ側に移動させないといけません。 このとき、どこまで汎用化させるべきかをフレーム情報(ファイル名、行番号)との兼ね合いから考えてみました。 ファイル名が変わるタイミン…

構文木を作る その5

今日はえらく中途半端な状態でコミットしてしまいました。 今日の差分 for文 switch文 module定義 class定義 を追加して、while文が作りかけです。 テストコードもとりあえず追加していて、while文が動かないのでコメントアウトしてあります。 今日詰まった…

Solaris 10 5/08 インストール

以前、GUIインストールに失敗した本家Solaris 10ですが、ダウンロードだけしてインストールしてなかったのでSunからインストールの仕方教えます的な催促のメールが来てました。 無視するのも気が引けたので、テキストモードで再トライしてみました。 今度は…

構文木を作る その4

変数展開処理と文法の事前インスタンス化を追加しました。 今日の差分 前のコードとほとんど同じです。 前のバージョンでは、内部は行番号カウント付きの反復子で処理し、結果を返すときに元の反復子に戻していましたが、今回はパース結果に構文木が含まれる…

構文木を作る その3

今日は、構文木を評価してECHOだけ動くインタプリタまで作りました。 構文木の使い方は分かったので、他の機能の実装方法もおおよそ見当がつきました。 演算や制御構造は特に問題はなさそうです。 面倒なのは、ruleとincludeです。 今回はruleを何度もパース…

構文木を作る その2

Hamigaki.Bjamの改良用にSandboxにディレクトリを追加しました。 hamigaki/bjam2 svn copyとかすると前のコードが枷になって大胆な変更がやりにくいので、必要な箇所を切り貼りしながら書き直していき、最終的にtrunkにマージする形をとります。 今日はbjam_…

構文木を作る その1

VMware上でテストしていると、Hamigaki.ArchiversとHamigaki.Bjamのビルドがキツいです。 特にCygwinテスト用に使っているWindows2000だと仮想メモリの割り当てを増やすよう警告が出ます。 CPUファンの音も煩くて困るので、コードを見直すことにしました。 H…

A-law

A-lawが動くようになりました。 差分 どうもA-lawは最終的に偶数ビットをビット反転しないといけないらしく、それを直せばおおよそ合ってました。 電気回路の都合みたいですが、ファイルフォーマットまで反転する必要もない気がします。 リファレンス実装と…

μ-law

μ-lawエンコーディングに対応しました。 差分 μ-lawというのは要するに「振幅の対数を取れば小さくなるよね」というエンコーディングです。 wikipedia:μ-law algorithm 実装としては、μ-lawと浮動小数点数の変換、μ-lawと32ビット整数の変換の二種類を実装し…

au_file.hpp

SunのAuファイルを扱うSource/Sinkを作りました。 <hamigaki/audio/au_file.hpp> Auファイルのフォーマットは、オーディオデータの前にヘッダが付いただけの簡単なものです。 wikipedia:Sunオーディオファイル ただし、Auフォーマットの標準エンコーディングであるμ-lawにHamigaki.Audio</hamigaki/audio/au_file.hpp>…

Solaris/NetBSD 対応完了

SolarisとNetBSDへの対応が完了しました。 Regression TestsにもSolarisを追加しました。 cs-solaris.html http://hamigaki.sourceforge.jp/status/

/dev/audio対応

pcm_sinkとpcm_sourceを/dev/audioに対応させました。 差分 さすがにpcm_device.cppが大きくなりすぎたので、実装毎にファイルを分けるようにしました。 差分 ついでにpcm_sink/sourceを通さずにアクセスできるように個別のクラスも用意しています。 audio_s…

NexentaCP 1.0をインストール

NetBSDのサウンドデバイスは/dev/audioです。 これの再生テスト環境の確保と、どうせなら違うOS入れてプラットフォームを増やしたほうがいいやという考えから、VMwareへSolarisをインストールすることにしました。 まず、最初に試したのはオフィシャルなSola…

endian.hpp on NetBSD

せっかくSourceForge.jpのコンパイルファームにNetBSD(x86)マシンがあるので、Hamigakiライブラリのビルドを試してみました。 で、Hamigaki.Charsetのテストでエンディアンが逆に判定されるという現象に遭遇しました。 問題の箇所はこうです。 template<> st…

sha2.hpp

SHA-1とSHA-256でコードの重複が目立ってきたので、「共通部分を切り出そう」、「ついでにSHA-512とかにも対応しよう」と思って書き始めたらSHA-2(SHA-224/256/384/512)用コードが出来上がりました。 <hamigaki/checksum/sha2.hpp> 当初の目的と違い、SHA-1は別コードのままです。 Boost.</hamigaki/checksum/sha2.hpp>…

Fedora 9 on VMware 5.5.6

Fedora 9をVMware 5.5.6にインストールしました。 まずHDDを認識しなくて困りました。 VMwareでHDDを認識しないことはよくあることで、大抵は別のOSでフォーマットした後なら認識できるのですが、今回はダメでした。 どうもSCSIだとマズいようで、IDEで仮想H…