実験君/技術系

Javascriptで時間のかかる処理を、外部プロセスを起動して標準出力から結果を取得することで擬似マルチスレッドのようなことが出来ないか、と四苦八苦。

まずは外部プロセスをC言語で書き始めてみたが、なんだかもう文字列の処理が面倒くさいし関数指向だしで嫌気がさして頓挫。
(.NET FrameworkのStringを使うという手もあるが、それだと開発環境はVisual Studioになるし動作環境にもランタイムが必要になるので却下)

次にJavaで書き始めた。素敵なことにjavaw.exeで実行すれば余計なコンソールが表示されないこともわかった。

おお、やったぜ。

調子に乗って、JavascriptとJavaの実行速度を比較すべく、指定数までの素因数を求めるとても単純なロジックを書いてみた。
2000程度であれば、Javascriptの方が速い。
3000程度になると、Java VMのオーバーヘッド込みでもJavaの方が速く終わる。
6000程度になると、Javaはフリーズする。

なっ…なにゆえッッ!?
Eclipseのアウトプットでは問題ないのに!

調べてみると、WshScriptExecの標準出力とエラー出力は4KBのバッファを共有していて、バッファがいっぱいになるとフリーズしてしまうらしい。
ということで、結果の出力が4KBを超える場合は、ファイルリダイレクトなどの措置が必要になる。
フリーズする前に例外を送出するとか、バッファサイズを増やすとか、そーいう回避策はどうも無さげ。

上記の挙動により、WSHから
“cmd.exe /c dir /S C:\”
とか
“cmd.exe /c tree C:\”
なんてのを実行して、結果を取得しようとすると、予期せずスクリプトが停止(無限ループ状態)になりえる。

コンソールアプリをヘルパーとして使う場合は注意が必要です。

コメント

タイトルとURLをコピーしました