iT邦幫忙

0

請問各位大神,C語言中 的迴圈程式,怎麼把迴圈執行的時間給固定呢?

  • 分享至 

  • xImage

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(void)
{

clock_t start_clock,end_clock;
int i;
double sum=0.0;
float spend;

start_clock=clock();
//取得程式從開始執行到此函數
//所經過的滴答數(ticks)

for (i=1;i<=100000000;i++)
sum+=i;

end_clock=clock();
//取得程式從開始執行到此函數
//所經過的滴答數(ticks)

spend =(double) (end_clock-start_clock)/CLK_TCK;
//計算1+2+3+....+100000000所花的時間
//CLK_TCK是定義在time.h內的常數名稱,
//其值等於1000(個滴答數/每秒)
//除以 CLK_TCK 常數,即可得到所花的秒數

printf("1+2+...+100000000=%.0lf\n",sum);
printf("計算1+2+3+....+100000000所花的時間:");
printf("%lf\n", spend);

system("pause");
return 0;
}

**以上是 計算1+2+3+....+100000000所花的時間,目前可以監控出每次執行迴圈所花的時間,那怎麼把每次迴圈執行的時間給固定呢?

froce iT邦大師 1 級 ‧ 2022-03-19 08:15:27 檢舉
建個cache(建議用外部的像是redis之類的),運算結果丟到cache,固定時間從cache取出。
每次迴圈執行的時間給固定,寫timer功能就可以,但為何要這樣做。固定執行每次迴圈只會讓計算減速。為了隱定輸出嗎?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
EN
iT邦好手 1 級 ‧ 2022-03-19 01:13:25
  • 設定一個目標週期時間 target
  • 如果 end - start 就繼續耗下去
start = clock();
while((end - start) < target) {
    end_clock = clock();
}
1

執行時間是沒辦法固定的
因為這是電腦本身執行效率問題
程式最多也只能優化執行的效率,如演算法

3
海綿寶寶
iT邦大神 1 級 ‧ 2022-03-19 10:32:04

這是腦筋急轉彎的題目
難不倒我的

題目是「計算1到N的和」
原做法是用連加法,花費時間為「N-1次的加法」,故時間不固定
正確解答是用梯形公式,花費時間為「1次加法+1次乘法+1次除法」,故時間可固定

選我正解
待會兒要吃韓式炸雞慶祝
/images/emoticon/emoticon71.gif/images/emoticon/emoticon71.gif/images/emoticon/emoticon71.gif

harutsuki iT邦新手 5 級 ‧ 2022-03-23 17:26:50 檢舉

你是正解 沒錯
梯形公式解決

1

我只想說。這是啥鬼??
埶行時間固定???

除非是筆誤。要不然我還真不知道該如何去回答這樣的問題。

這是辦不到的事。因為運行的時間,不是程式能夠掌控的。
難不成,你叫他執行1秒。它執行了5秒。那這就是程式BUG嘛??

0
Luke
iT邦研究生 5 級 ‧ 2022-03-21 08:46:52

您是說WINDOWS 嗎?

先使用程式 CALL 另一個(迴圈程式)
並找出"處理序識別碼"PID,並記錄PID 時間
當時間到了~ 就將KILL PID
c:\>taskkill /IM ***.exe
這樣就會達到您要的執行的時間給固定。/images/emoticon/emoticon01.gif

Linux下要刪除某個程序通常會使用 ps 配合 kill 來刪除程序。
kill -9 [PID]
所以您也要知道PID

0
tw_hsu
iT邦新手 3 級 ‧ 2022-03-21 15:12:12

我想這是因為你對「演算法」的功能與目標認知有點誤會

上面有人有提供一些直接回答你答案的做法
其中有一個是:控制一個迴圈運行的時間,到了就強制結束
但這樣會讓回圈變得不可靠
(只可用於更新畫面之類本來就不講求絕對穩定可靠,只要相對可用即可的任務。)

其實控制運算時間的目的在於...
假設end_clock有兩個例子(從多種可能中取出兩個)
這兩個數值差異在100以上
但丟進回圈中取得答案,則取得答案所需的回圈執行次數差異就是100倍以上
如何將這個次數差異控制在「可接受」的範圍內才是「把每次迴圈執行的時間給固定」

所以用數學計算式去求答案
不管數值差異是多少(除非答案已經發生資料溢位)
所需要的次數應該都一樣(因為都是一次)

也就是說...
這題真正的答案是要你「別用回圈」做事情
這直覺上有點違反你學習程式過程中所建立的基礎認知
但程式本來就不是只有回圈
回圈讓程式的功能變得強大,但更基礎的東西(如何計算、如何邏輯判斷)讓程式變得神通廣大

不明
【**此則訊息已被站方移除**】

我要發表回答

立即登入回答