2013-12-10 54 views
1

我一直在編碼與Perl和我做一些計算,這些都佔用了一些時間在相當長的for循環...循環的大小是由用戶給出。perl的 - 絲印定期不睡覺()

所以在每十秒鐘左右的時間,我想在屏幕上打印一些信息,而無需使用睡眠功能,因爲有其他事情怎麼回事,我不想把時間浪費在睡眠功能。

任何想法?

+0

我通常會添加一些很長的循環 - 例如'如果(循環計數器%10000 == 0)printf的( 「」);'。將其翻譯成您最喜歡的語言/情況。每個循環一個額外的語句通常不是一件大事。如果是這樣,你可以在一個更大的循環內創建一個10k循環,並在到達外部循環時進行打印(每循環開銷爲零)。 – Floris

+0

是啊我也想過,但不是我最糟糕的解決方案。我想在定期的時間間隔內打印,而不是定期處理。 感謝儘管 – cengizUzun

+0

然後,而不是重複計數,檢查時鐘是否已結束,在一些數字。會有點慢... – Floris

回答

1
use threads; 

async { 
    my $i = 0; 
    LOOP: { 
    print $i++, "\n"; 
    sleep 10; 
    redo LOOP; 
    } 
}; 

# rest of program.. 
1

通常這不是一個問題。因爲你的工作有了進展。依靠這一進展,你偶爾可以打印一些東西。

但是,如果你想準確地打印每10秒就可能更好地使用另一個線程來打印進度用戶每10秒和sleep()功能。

此外,你可以直接處理時鐘,即保持startTime並計算currentTime如果他們的differenceInSeconds % 10 == 0然後打印的東西。

2

如果你想每隔五秒鐘後打印在相當長的環路的東西,你可以做這樣的事情(僞代碼,但你的想法):

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)。

+0

耶也試過,但它顯着減慢了代碼速度... – cengizUzun

+0

第二個版本不應該放慢你的速度。時間檢查只發生在你想要的頻率上(每10,100,1000次...取決於你的內循環有多緊張,這可能對性能有「零」影響)。 – Floris

1

您可以使用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         
+0

這聽起來不錯,但我的代碼在線程中運行 - 取決於用戶輸入,最高可達幾個k - 它如何與威脅一起工作? 可以說5個威脅運行一個for循環......它是由不同的威脅運行的同一個循環......我會在酒吧看到什麼比? – cengizUzun