Actionsグローバル変数は遅い?ふとしたことから以下のような不思議な現象を発見してしまいました。total奇妙ですね。maininitとdoitがinlineになってないじゃん。それぞれ一回しか呼ばれていないので全然関係ないのですが、一応inline化しましょう。inlineを使わないとだめだよとのことなので以下のように修正します。dataおし消えました(一応asmでも確認)。totalまあ当然の結果です。以下にtest.cpp.outとtest.c.outのdesasmされた.textをのせます(gccの-Sでもいいのですが読みにくいので)。rettest.c.oのほうはリンク時にdataのアドレスが0x0にrelocateされるんですが、それを除けば全く同じです。addressでされるらしいので、どこで遅くなるのか見当もつきません。実効アドレッシングで差がついてるのか、あるいはちゃんとアドレッシングの原理を理解していないのか、COMMONなオブジェクトはなんらかの理由があって遅いのか、はたまた、等々。以下の資料を読みあさっています。http://www.intel.co.jp/jp/developer/download/index.htm#ia32わかりしだい追記したいと思います。誰かわかる人いたら教えてください。この辺の知識はかなり疎くてしょうがないですもう。ValgrindにCachegrindというCPUのキャッシュ機構をシミュレーションしてキャッシュミス数等をプロファイルする機能があることを知ったので試してみました。Sizeは16KBらしいのでtest.cpp、test.cのdataのサイズをそれにあわせました。)この結果を見たかぎりではC版のほうが当然速くなるはずなのですが...どうやらキャッシュミスとかアラインメントの問題でもないようです(cachegrindを信用して)。01:48答えは分かりませんが、一応追試。C++版の方が速いです。sarge)CPUが遅い分、数値がはっきり出ます。C版は平均して5.5秒程度、C++版は平均して4秒程度です。%edx,0x0(,%eax,4)事実だけ見れば、これ(および類する箇所)が遅い、としか言いようが無さそうです。11:12AMDでもなるんですか。Pentiumの特殊な最適化のせいではないってことですね。個人的には局所化の問題なような気がしてならないんですが、ちゃんと証明できないのでまだまだ調査中です。改造しまくるためにまずはビルドだと思って早速ビルドしたらエラーでたのでその対処メモです。ちなみに詳細は環境は以下のようになっています。GNU/Linux最初にエラーが出るビルド方法を紹介しておきます。ほうを読みにいっていてオブジェクトファイルと共有オブジェクトファイルとのアーキテクチャが合わないのが原因らしいです。取りのぞいてみたりしたのですが、他の所で新しいエラーが出てきて切りがない状態になりました。makeとやってみると見事にビルドできました。深く追求すると時間がいくらあっても足りない)。コマンド使うってのは個人的に反則です以上。以下適当にリンク貼りまくる。嫌いだ!っていうテーマ。01:28これ解決するために三日かかったってのは内緒。大好き子なら一度はやりたいと思うはずの文字列テンプレート引数の対応。一応以下のようなことはできるようになっている。0;}まだ未実装だけど以下のような記法も導入したい。0;}大体これだけあれば不自由しないはず。いう仕様だから仕方ないけど。