管理人の雑記
- 1 :管理人 ★:06/04/30 20:55 ID:???
- 雑記サイト移転に伴い、AutoHotkey関係はこっちに書くことに。
- 128 :管理人 ★:2009/05/04(月) 04:59:34
- >>124をマルチスレッドに対応させるなどした。
SpiderMonkeyをマルチスレッド対応させる上で主に注意すべきなのが、GCのタイミングであるらしい。
あるスレッドが何かに使うためにオブジェクトを生成して、他から参照されている状態にする前に、他のスレッドでGCが実行されてしまうと、使うはずだったオブジェクトが解放されてしまう恐れがある。
そこで、リクエストという仕組みで、スレッドがJSAPIの処理中であることを通知して、GCが発生しないようにしておく必要があるらしい。
GCが必要になると、他の全てのスレッドのリクエストが完了/中断されてGC可能状態になるまで待ち合わせてから、GCが実行されるらしい。
オブジェクトなどへのアクセスは、排他制御が行われるので、複数スレッド間で共有しても問題無いらしいが、共有オブジェクトへのアクセスが多発すると、待ち合わせが多発して効率は落ちるようだ。
大体の仕組みが分かったので、まず既存のコードにJS_[Begin/End]Request()などの処理を追加した。
次に、マルチスレッドでスクリプトを実行できるようにする。
とりあえず、別途作成したJSAPIコンテキストを使い、新規スレッドで指定のスクリプトを実行するという関数を用意してみた。
また、関数をネイティブコード側から呼べるようエクスポートする関数に、不特定多数のスレッドから呼ばれても大丈夫なようにする機能を追加。新規コンテキストを生成するコストが大きいため、従来方式と選択可能にした。
前者はグローバルオブジェクトも新規作成するが、後者は元のコンテキストのグローバルオブジェクトをそのまま利用する。
とりあえず、以前の1から60万までを文字列として連結する処理を2つのスレッドで実行させてみたところ、異様に遅くなった。
両方のバージョンとも速度は大差ないので、問題なのはGCの待ち合わせのようだ。
文字列やオブジェクトをあまり生成しないであろう素数探索処理を並列実行させたところ、シングルスレッドの時とほとんど同じ速度で実行された。(マルチコア環境なので)
コンテキスト作成版と関数エクスポート版での速度差はあまり見られない。
グローバルオブジェクトを共有すると、文字列やオブジェクトの操作時にも共有部分へのアクセスが発生して遅くなるかと思ったが、それほど問題にはならないようだ。
関数エクスポート版では、グローバル変数や関数が生成されたスコープでの変数にも普通にアクセスできるので、利便性が高い。
実際にマルチスレッド処理が必要になるのは、処理時間のかかるAPIの実行中に他の処理を行わせたい場合等だろうから、GCによる効率の低下はそれほど気にする必要はないだろう。
どうしてもそのような処理を並列実行させたい場合は、プロセス自体を並列化させればいい。
- 129 :unnamed.ahk:2009/05/11(月) 12:56:46
- .NETFrameworkで作成されたアプリケーションのコンボボックスの選択値を取得する方法を知っている方がみえましたら教えてください。
ControlGet関数でChoiceを使用しても値を取得できません。
よろしくお願いします。
- 130 :管理人 ★:2009/05/11(月) 14:32:11
- スレ違い
- 131 :管理人 ★:2009/12/12(土) 02:39:52
- 「File.exists」か「File.exist」か
迷って、検索して以下のページを見つけた
tp://piro.sakura.ne.jp/latest/blosxom/topics/2008-10-08_naming.htm
が、結局文字数の少なさを優先して、「has」「is」以外は原型にすることにした。
- 132 :管理人 ★:2009/12/23(水) 08:27:08
- >>124を久しぶりに更新。
ネイティブコード関数を呼び出したときに、GetLastError()の値を取得して例外を投げる機能を追加した。
どうやら、ラッパ関数の中で使われているJSAPI呼び出しでエラーコードがリセットされてしまうらしく、
GetLastError()をラップしても役に立たないため。
それと、>>131は、exist以外の例が思い浮かばないので、sをケチるのはやめてexistsにした。
- 133 :管理人 ★:2009/12/27(日) 12:07:20
- >>124を更に更新。
指定アドレスの64ビット整数を読み書きする機能を追加した。
符号無しであれば既存の機能だけでも無理矢理何とかなりそうだが、
符号付きの64ビット整数の負の値を読み書きするのが面倒くさそうだったので。
- 134 :管理人 ★:2010/01/01(金) 08:22:57
- 去年、延々と人知れず作っていたスクリプトを公開してみる。
>>124をまともに使えるようにするためのライブラリである。
ng.exeのディレクトリにlibディレクトリを置いて、ng.jsに
__NG__EvalFile(__NG__HostPath().replace(/([^\\]+)$/,"\\lib\\Base.ng"));
と書き、その下にプログラムを記述すれば試せる。
コマンドラインで与えられたスクリプトを読み込んで実行する部分とかは、そのうち実装する。
prototype.jsのように、独自のクラス機構を中核としたライブラリになっている。
インスタンスメソッドの他にクラスメソッドを登録でき、ミックスイン的なものによる多重継承のような感じの機能も搭載するなど、色々とややこしくなってしまった。
ドキュメント的な物はまだ無いが、スクリプトの後ろの方を見れば、前の方で定義された機能がどんな感じのものかくらいはわかるかも知れない。
投稿ファイル名: lib.zip
http://lukewarm.s101.xrea.com/bbs/file/1146398137_134.zip
サイズ: 18348 bytes
- 135 :管理人 ★:2010/01/30(土) 06:19:45
- >>134にスクリプトファイルへの関連付け機能や、それなりのドキュメントなどを追加して、そこそこ実用的な感じにした。
以降は下記のスレで。
http://lukewarm.s151.xrea.com/test/read.cgi/b/1264431038/
- 136 :管理人 ★:2010/02/05(金) 00:02:10
- http://lukewarm.me.land.to/を更新。
スクリプトが最後に評価した値をプロセスの終了コードにするように。
関数のインポート・エクスポートで、文字列系の型を廃止。
GetLastError()の値を例外として投げる場合、関数の返値をプロパティとして得られるようにした。
101KB
0ch BBS 2005-10-08