我一直在編碼與Perl和我做一些計算,這些都佔用了一些時間在相當長的for循環...循環的大小是由用戶給出。perl的 - 絲印定期不睡覺()
所以在每十秒鐘左右的時間,我想在屏幕上打印一些信息,而無需使用睡眠功能,因爲有其他事情怎麼回事,我不想把時間浪費在睡眠功能。
任何想法?
我一直在編碼與Perl和我做一些計算,這些都佔用了一些時間在相當長的for循環...循環的大小是由用戶給出。perl的 - 絲印定期不睡覺()
所以在每十秒鐘左右的時間,我想在屏幕上打印一些信息,而無需使用睡眠功能,因爲有其他事情怎麼回事,我不想把時間浪費在睡眠功能。
任何想法?
use threads;
async {
my $i = 0;
LOOP: {
print $i++, "\n";
sleep 10;
redo LOOP;
}
};
# rest of program..
通常這不是一個問題。因爲你的工作有了進展。依靠這一進展,你偶爾可以打印一些東西。
但是,如果你想準確地打印每10秒就可能更好地使用另一個線程來打印進度用戶每10秒和sleep()
功能。
此外,你可以直接處理時鐘,即保持startTime
並計算currentTime
如果他們的differenceInSeconds % 10 == 0
然後打印的東西。
如果你想每隔五秒鐘後打印在相當長的環路的東西,你可以做這樣的事情(僞代碼,但你的想法):
tLast = currentTime modulo interval
for (some long loop):
tNow = currentTime modulo interval
if tNow < tLast:
print "something"
tLast = tNow
doSomethingElse
如果循環頗爲緊張,這將添加了過多的開銷,做
for (some long loop):
tNow = currentTime modulo interval
if tNow < tLast:
print "something"
tLast = tNow
for(some tight loop):
doSomethingElse
現在的時間進行檢查發生的「只能每隔一段時間」 - 所以沒有開銷爲最緊密的循環,只爲密少外環(這在本質上是一個組合我在第一條評論中提出的建議,以及我在後面的建議中提出的建議NE)。
耶也試過,但它顯着減慢了代碼速度... – cengizUzun
第二個版本不應該放慢你的速度。時間檢查只發生在你想要的頻率上(每10,100,1000次...取決於你的內循環有多緊張,這可能對性能有「零」影響)。 – Floris
您可以使用Smart::Comments來生成進度條。
use Smart::Comments;
use Time::HiRes qw(usleep);
### process started
for my $n (0..1000000) { ### Initializing... done
usleep 5; #...simulate work...
}
### process ended
1;
將產生:
### process started
Initializing.............. done
這聽起來不錯,但我的代碼在線程中運行 - 取決於用戶輸入,最高可達幾個k - 它如何與威脅一起工作? 可以說5個威脅運行一個for循環......它是由不同的威脅運行的同一個循環......我會在酒吧看到什麼比? – cengizUzun
我通常會添加一些很長的循環 - 例如'如果(循環計數器%10000 == 0)printf的( 「」);'。將其翻譯成您最喜歡的語言/情況。每個循環一個額外的語句通常不是一件大事。如果是這樣,你可以在一個更大的循環內創建一個10k循環,並在到達外部循環時進行打印(每循環開銷爲零)。 – Floris
是啊我也想過,但不是我最糟糕的解決方案。我想在定期的時間間隔內打印,而不是定期處理。 感謝儘管 – cengizUzun
然後,而不是重複計數,檢查時鐘是否已結束,在一些數字。會有點慢... – Floris