HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0821
cmoawaitの仕様がわからない7解決


cmo

リンク

2020/8/21(Fri) 17:21:48|NO.91227

こんにちは。
プログラムを組んでいて、だいたい10秒数えたいなって時に、
awaitとカウンタを使えばいいかと思い組んでいたのですが、
awaitの秒数で微妙に挙動が違うのに気付きました。
そこで以下のテストプログラムを作ってみたのですが、私の環境だと
await 1が遅いのはわかるのですが、await 2よりawait 3のほうが時間がかかるのがよくわかりませんでした。
こういう仕様なのでしょうか、わかる方いたらお願いいたします。
以下スクリプト

repeat 10 time = gettime(6)*1000+gettime(6) cnt_j++ cnt_i=0 repeat if cnt_i>=10000 : break title ""+ cnt_i cnt_i += cnt_j await cnt_j loop mes "await "+cnt_j+":"+(gettime(6)*1000+gettime(6)+(gettime(6)*1000+gettime(6)<=time)*60000 - time) +" ms" loop



この記事に返信する


cmo

リンク

2020/8/21(Fri) 17:41:20|NO.91228

いや、title命令を抜いてもawait 1はawait 2の2倍かかってるので
await 1が遅いのもよくわからんですね。



ソラ

リンク

2020/8/21(Fri) 18:15:43|NO.91230

gettimeの使い方を間違ってませんか?
こんな感じでどうでしょうか。

#include "d3m.hsp" repeat 10 time = d3timer() cnt_j++ cnt_i=0 repeat if cnt_i>=10000 : break title ""+ cnt_i cnt_i += cnt_j await cnt_j loop mes "await "+cnt_j+":"+(d3timer() - time) +" ms" loop



沢渡

リンク

2020/8/21(Fri) 18:24:56|NO.91232

「await 1で10000回ループ」と「await 2で5000回ループ」なら、
前者の方がHSPの内部処理の影響も大きくなるので
合計時間も長くなる……というのは想像つきますが、
「await 3で3334回」が「await 2で5000回」より大幅に時間がかかるというのは
本当に謎ですね。
「await 5で2000回」が微妙に時間がかかるのも気になります。

まあ、awaitの値を極端に低くすると負荷がかかりますし、
ある程度正確に時間を測定したいならTimeGetTimeを使えば良いのではないかな、と。
(もしくはソラさんのコードでも使われているd3timerか)

#include "winmm.as" TimeGetTime start=stat cou0=0 : cou=0 repeat TimeGetTime now=stat-start if now>=10000 : break cou=now/1000 if cou!=cou0 : cou0=cou : mes cou await 50 //1秒間におよそ20ループ loop mes "10秒経過しました"



ソラ

リンク

2020/8/21(Fri) 19:30:35|NO.91233

少し補足です。
念の為確認ですが、
>>time = gettime(6)*1000+gettime(6)
これは
>>>>time = gettime(6)*1000+gettime(7)
の間違いで合っているでしょうか?
(mesの数式も同様の間違いがあるかと)

てっきりgettimeの間違いが原因だと思っていましたが、
改めて考えるとcomさんが貼ったソースコードでも1秒以上の誤差は出ないはずなので、
2倍も時間がかかるのはおかしいですね。
https://gyazo.com/2e8c2f4435e98feb1ff3b3fb0ab50a76
私の環境ではawait 1以外は約10秒程度なのでバグの再現はできませんでした。



cmo

リンク

2020/8/22(Sat) 13:57:16|NO.91241

ありがとうございます。
単純ミスしてました;;
time = gettime(6)*1000+gettime(7)でした
ただ、時間計測が正確でなくとも10秒カウントで3秒ほどの開きがあるので不思議に思いました。
私の環境ではこんな感じです。await 3,5で長くなるのは解せません笑


await 1:20013 ms await 2:10043 ms await 3:13316 ms await 4:10037 ms await 5:11973 ms await 6:11259 ms await 7:11226 ms await 8:11184 ms await 9:11076 ms await 10:10969 ms



ソラ

リンク

2020/8/22(Sat) 14:52:19|NO.91242

なぜ3,5だけなのかはわかりませんが、awaitの待ち時間を列挙してみると、
時々10ms以上かかっていたりしてますね。
おそらく何らかの割り込みが入っているのかと。

#include "d3m.hsp" winx=ginfo_dispx-100 winy=ginfo_dispy-100 mes_y=winy/20 dim cnt_timearr,100 screen 0,winx,winy cnt_j=3 repeat 10000 time = d3timer() title ""+cnt_time+","+cnt_i+"" if cnt_i>=10000 : break cnt_i += cnt_j await cnt_j;-limit((cnt_t-cnt_j),0);前回のウェイト値から補正 cnt_t=(d3timer() - time) cnt_time+cnt_t cnt_timearr.cnt_t+1 pos (cnt/mes_y)*50,(cnt\mes_y)*20:mes ""+cnt_t+"ms" loop screen 1,200,winy repeat 100 pos 10,cnt*20:mes ""+cnt+"ms "+cnt_timearr.cnt+"回" loop



cmo

リンク

2020/8/22(Sat) 15:32:32|NO.91243

みなさまありがとうございます。
あまりawait 5以下の処理はしないほうがいいですね
とりあえず処理を変えてみようと思います。



ONION software Copyright 1997-2023(c) All rights reserved.