><https://twitter.com/orange_in_spacehttps://pawoo.net/@orange_in_space
LINQPad入れてみたけど、出来上がったものをMSILで見ることは出来るけど、書いてアセンブルは出来ない・・・?><
たぶんだけど、JavaVMも同じくスタックマシンだから、cs版をJavaに、MSIL版をJavaバイトコードアセンブラ(?)にほぼそのまま移植したら同じくらいの差が出そう・・・?><
ものすごく前にマストドンで「MSIL(CIL)を直接書いて速くなる場面なんてあるのかな?><」って書いた記憶あるけど、一応あることはあるんだね・・・><(たぶん実用的な意味は無いけど><;)
オレンジはdnSpyで中身見てた><
あとReflexilとかdnSpyでILいじって遊ぶのも楽しいです
これなにがいいって、命令にカーソル乗せると意味が表示されるんですよ
MSIL、LINQPadで簡単に読めると知って好感度上がった https://mstdn.maud.io/media/H2BFUbBnY4ReZ2Hnx2s
あれ?><; 最適化無しで試したらC# 版: 3295msMSIL版: 1453msSystem.Math: 63msって結構差が・・・><;
そういえばMath.Sqrtは…ってそりゃInternalCallですよね https://referencesource.microsoft.com/#mscorlib/system/math.cs,188
(Delphiじゃなくbccだったかもしれない・・・><(よく覚えてない><;))
でも、生まれて初めてアセンブラで書き直して高速化に成功できたから一応うれしい><(DelphiでMMX使って数命令の短いインラインアセンブラなコードで速くした事なら前にあるけど、処理丸ごとアセンブラで書いて速く出来たのは初めて><)
やっとdllに出来たのでベンチマークしてみたけど、10000000回ループで、C# 版: 1477ms手書きMSIL版: 1458msって速くはなったけどものすごく微妙><; そしてSystem.Math: 3ms・・・・・・・・><
dllとしてアセンブルしてもなぜかVSのオブジェクトエクスプローラで中身が表示されない・・・><
ループの中身、C#バージョンではnop抜いて27命令だったのを、19命令に減らせたっぽい><
なんか頭の使い方がパズルっぽくて、普段のプログラミングよりもテラリアとかで計算機の回路作って遊んでる時に近くておもしろかった><
参考文献>< もっと見る
アルゴリズムの元ネタ(実質これの移植版><)http://www.avrfreaks.net/comment/474232#comment-474232
CIL(MSIL)関連http://www5b.biglobe.ne.jp/~yone-ken/VBNET/index.htmlhttp://www.atelier-blue.com/program/il/
gistに置いてみました><sqrt CIL https://gist.github.com/orange-in-space/5bc1fb65fa9bfa12ebd48c40e586d77d
!><
@orange_in_space gist
コメントの // F hoge, fuga みたいなのはスタックの状態のメモです><;
思考の /dev/null