IE9のJavaScript Engine ChakraをWin2000で動かしたら爆速だった件

開発者が知っておくべきIE9の新機能 - @IT
Windows 2000 Kernel32 改造計画【BM】

Windows 2000でIE9の高速な Java Script エンジン Chakra が動作するか実験してみました。
まず、動作させるためには、拡張カーネル v2.3f が必要で、NT6モードでインストールする必要があります。

IE9は互換モードの兼ね合いで、Jscript9.dllと jscript.dll が共存しているせいか IE6からではどうやっても、jscript9.dllを呼び出すことができませんでした

そこで、他のサイトを参考に、Windows Script Host で使えないか実験してみました

JavaScript エンジン Chakra を無理矢理使う。 - ういはるかぜの化学 - subtech

win2kjs9
JavaScript Engine 5.8.22024 と (5.)9.0.20606 でフィボナッチ数列を40個求めるプログラムを動作させてみた結果がこれです。

速度差、50倍という凄い結果に ・ω・;

ちなみに、 最初組み込んだ時、 mov eax, fs:[2ch] の後 EAXの値を参照して落っこちていたんですが、
どうやら、Windows Vista 以降は LoadLibrary を使用しても、TlsAlloc で確保した スレッドローカルストレージのアドレスがちゃんと入ってるようで使えるっぽいので、そこのコードを細工したら動いたのでした。

yunoの雑記帳 - ThreadLocalStorage

ちなみに、LoadLibraryは前述の初期化処理を行わないので、動的ロードされるDLLではTLSを使えない。らしい。

動作させたソースコード

WScript.Echo(ScriptEngine() + '/' + [ScriptEngineMajorVersion(), ScriptEngineMinorVersion(), ScriptEngineBuildVersion()].join('.'));
function fib(i) {
  if(i == 0 || i == 1) return i;
  return fib(i-1) + fib(i-2);
}
var startAt = new Date();
x=fib(40);
var EndAt= new Date();
WScript.Echo("Start:"+ startAt );
WScript.Echo("End:"+EndAt);
WScript.Echo("result :"+x);
WScript.Echo ((EndAt - startAt)/1000 +"秒");

ういはるかぜの化学さんのところにあったほとんどそのままですが・ω・

動かし方は cscript //E:{16d51579-a30b-4c8b-a276-0ff4dc41e755} ソースファイル名

注:Windows 2000 拡張カーネルには XPにも存在しない関数がいくつか実装されてるので、XPでは残念ながら jscript9.dllは動きません
win2kjs9a
XPだとこんなかんじで 欠陥 export が
EventUnregister
EventRegister
EventWrite
QueryThreadCycleTime
SetThreadStackGuarantee
_except_handler4_common
__libm_sse2_atan2
__libm_sse2_tan
__libm_sse2_sin
__libm_sse2_log
__libm_sse2_exp
__libm_sse2_cos
__libm_sse2_atan
__libm_sse2_asin
__libm_sse2_acos
_wcslwr_s
_wasctime_s
_localtime32_s
__libm_sse2_pow
_ui64tow_s
_itow_s
_snwprintf_s
memcpy_s
_i64tow_s
swprintf_s
wcscat_s
_ltow_s
_ultow_s
wcscpy_s
wcsncpy_s
qsort_s
__CxxFrameHandler3
_ftol2_sse
_ftol2

と表示されます
 

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です