Posted at 2006/08/04 23:32
in Programming
そういえば、今日(既に昨日)は
Binary 2.0カンファレンス
の日でしたか。どんな内容だったか気になるなあ……。
というわけで、せっかくなので(?)バイナリっぽいネタを少し。
諸事情で、以下のような機能を実現する必要があるとします:
printf()と同じフォーマットが使えるデバッグログ記録関数を作る。
ただし、vsprintf()は使えない。sprintf()は使える。
独自のログ書き出し関数log_puts()は、固定引数で文字列へのポインタを1つだけ受け付ける。
vsprintf()が使えれば一発で終了ですが、それが使えないとなるとどうしたものか。sprintf()が使えるのはいいけど、可変長で渡ってくる引数をどうやって渡せばいい?
(続きを読む)
Posted at 2006/08/04 23:32
in Programming
一部で話題の
長文コメント
のあたりで触れられてる「
Javaの理論と実践: パフォーマンスに関する都市伝説を再検証する
」の記事。以前ブックマークしたまますっかり忘れてたので、いい機会なので読んでみました。
字義通りに受け取りすぎてしまう人いるみたいですけど、結論から言えば、速いケースは十分あるでしょうね。
記事ではメモリアロケーション処理について論じていますが、「malloc()でヒープメモリ確保」と「(最適化された結果)レジスタやスタックに割付け」を比較すれば、後者のほうが速いのは当然です。こういった差を積み重ねられれば、Cなどでべた書きするよりも、JavaなどのVM系環境の方が速くなる……というのが、動的最適化による高速化の思想でしょうか。
もちろん、最適化ゲインが動的最適化のための統計・分析コストを上回る範囲内にあることが前提です。逆に言えば、全コスト内で占める動的処理コストの割合が、ソフトウェアの巨大化と計算機パワーの増大によって相対的に低下したことで可能になった高速化手法であるとも言えるでしょう(機能ではなく、高速化のための動的化ってのは今まで考えたことなかったな……)。
もちろん、目的に比べて過剰な動的処理を行えば、当然最適化ゲインを食いつぶすだけで高速化にはなりませんし、とりうる挙動が限定されるシチュエーションでは、一般的・汎用的シチュエーション向けにチューニングされた最適化よりも、そのシチュエーションに特化した手作業の静的なコードの方がより効率的に動作するでしょう(静的処理の最後の砦?)。
初期のJavaなどは後者の悪い部分が目立っていたわけですが、計算機パワーの増大と最適化手法の進歩の相乗効果で、最近では前者に転んできたといったところでしょうか。
一方、現在でも後者のシチュエーションを積極的に利用してるのが、いわゆる「組み込み系」ですね。シチュエーションを限定すれば、現在の半導体技術の成果でより小型に、より広範囲にコンピューティングを提供することができるという「
イノベーション
」の一典型です。
この分野でも、ICチップと無線の融合という形で次のイノベーションが登場しつつありますけど。
Posted at 2006/08/04 23:32
in Programming
このへん
の話。やりかた思いついたので、VCでやってみました。ソースは
こちら
。VC6のコンソール環境で確認。
オリジナルとの違いは、define()の第4引数以降をまとめて括弧で囲む必要があること。これは、VC6は(あたりまえですが)C99対応しておらず可変長関数マクロが使えないので、第4引数以降を1つの引数として扱っているためです。これを関数本体の文字列にしているのが asprintf_like() ですが、別段言及するほど特別なことはしていません。
オリジナル同様、単なる力業ですねえ。
Posted at 2006/08/04 23:32
in Programming
higeponさんが
作られてた
ので、なんとなく
参加してみました
。16進ダンプと逆アセンブラをこよなく愛する(やや誇張)身としては、web2.0とかよりこちらの方が面白そうなので:)
でも週末まで身動きできなさげ(しくしく)。
Posted at 2006/08/04 23:32
in Programming|WebDev
某#techでPerl話をしていたところ微妙にPerlが書きたくなったので、久しぶりにごそごそ書いてみました。右上にある「Recent bookmarks」がその成果。
やってることはというと、単に「はてなブックマーク」のatom feed拾ってきて、XML::Parserで抜き出して成形しているだけです。ソースはこちら。blosxom 2.0用です。
……そういえばblosxom3.0ってどうなったんだろう。
2005.9.25 追記:
負荷軽減のため、Atomそのままではなく、パースしてHTMLにしたものキャッシュするようにした。毎回XML::Parserしていたのが、Atom取得時だけになったので、大分軽くなったはず。