2016年7月5日火曜日

【解決&多謝】 複数通貨ペアのOnTick() EventSetMillisecondTimer その4

だいすけさんからWINDOWSの割り込みタイミングについて教えていただきました。
HALといえば2001年宇宙への旅立ち?
見たことは無いのですが有名な映画です。
うる覚えなのですが、HALという最強コンピューターとモノマーが戦う?
そしてHALはIBMの一文字上をとってなずけられたと
H⇒I A⇒B L⇒M 

話しが脱線しました。
結局ウインドウズは10msもしくは16ms単位で割り込み処理をしているようです。
OSの特性のようですので、他のOSの場合違うようです。

そこでVPS上で測定です。

使えるねっとUS と お名前.COM日本で測定しました。

ソースはこちら 純粋にVPSの最適な秒間隔の比較です
前回の失敗 一回目と二回目はカウントしません


int i,k,l,m,os;datetime t;string texts;
extern int j=1;
void OnInit(){EventSetMillisecondTimer(j);}
void OnDeinit(const int reason){EventKillTimer();}
void OnTimer(){
if(os==TimeSeconds(TimeLocal()))
{i++;}
else{m++;if(m>2)
{k++;l+=i;texts=TimeMinute(TimeLocal())+":"+TimeSeconds(TimeLocal())+" count"+(l/k)+" "+m;Comment(texts);}
i=1;os=TimeSeconds(TimeLocal());
}}



使えるねっとは最多が15秒間隔、次点が3,4秒間隔です。
お名前.COM日本は2,3秒間隔が最多です。

両方15msを超えると急に回数が減ります。
複数回測定してもほぼ同じ値が出ます



おなじWIN2008のはずです。
なぜ違う結果になったかは謎・・・

EventSetMillisecondTimerは使えるUSでは15msがよさそうですね。

2 件のコメント:

  1. あー。すみません。少し勘違いさせてしまいましたか。OSの仕組みに依存していますが、HALはハードウェア依存のDLLです。(hardware abstraction layerの略で、日本語ではハードウェア抽象化レイヤーといいます。)

    この場合、この場合、つかえるネットとお名前.comで使用しているVPSサーバーアプリの違いに差が出ていると思われます。(VPSが仮想ハードウェアとして動作しているためです)

    なお、どうしても16ms以下の最小値にしたい場合は、timeBeginPeriodというWindowsAPIをたたくやり方がありますが、システム全体が不安定になる可能性がございますので、ご注意ください^^;;;;主にゲームなどで使われる設定ですので、VPS向けの指定ではないです・・。

    また、例えば、timeBeginPeriodに1を設定しても実行タイミングは0.8ms~2msぐらいの間で揺れます。これもWindowsのプロセス管理による待ち時間制御に影響されるためです。

    ちなみに15msの次は、25msぐらいになります。タイマ設定の分解能が約10ms(これもハードウェア構成で変わる)のためです。

    返信削除
  2. だいすけさん
    またもや解説ありがとうございます。
    お名前.COMの回数が多くなった理由が分かった気がします。

    Amser1.2に早速15msで導入してリアルテスト開始しました!
    だいすけさんは何でもご存知ですねー

    返信削除