イベントPullモデルのオーバーヘッド
まともなLatency計測実験をする時間は到底とれないので、
- イベントをPullする
- メッセージsendでPush する
の両パターンで伝言ゲームを繰り返し行い、オーバーヘッドだけを測ってみます。某MLのように「こういう"ベンチマーク"は時間の無駄」とお叱りを受けそうです。。。
伝言一回分のオブジェクト(抜粋):
CObject subclass: #CxEventChannel instanceVariableNames: '<?xml version="1.0" ?> <fields> <field toGet="prev" toSet="prev:" changeEvent="prevChanged">prev</field> </fields>' classVariableNames: '' poolDictionaries: '' category: 'Experiment-Latency'! !CxEventChannel methodsFor: 'testing' stamp: 'KR 5/25/2005 01:00'! post self signal: #arrived. ! ! !CxEventChannel methodsFor: 'testing' stamp: 'KR 5/25/2005 01:22'! send prev ifNotNil: [ prev send ]. prev ifNil: [ self signal: #arrived ]. ! ! !CxEventChannel methodsFor: 'events' stamp: 'KR 5/25/2005 01:01'! onArrived <on: arrived in: prev> self post.! !
これを100000回繰り返したところ、メッセージ送信で7秒、イベント送信で8秒かかりました。(CF-W2上でテスト)。FM音源のドライブ on Windowsだけなら、VM律速となり神経質になる必要はなさそうです。(もちろん、イベントの発生密度などでキューやスケジューラに負荷をかけておらず、本来のLatency計測とはかけ離れた、あまり意味がないテストであることは承知しており、ご批判は甘んじてお受けします。)
ということで、Andreasの案2に忠実な設計+さらに部品のレイヤ間もイベントで伝播させるという元の設計に戻して、しばらくやっていこうと思います。
過剰反応だったようです。。。