前段時(shí)間從windows移植了一個(gè)程序到linux上,不知為何性能奇差。查了下原因,發(fā)現(xiàn)是由于一個(gè)函數(shù)ZeroSleep特別耗時(shí),這個(gè)函數(shù)的代碼很簡(jiǎn)單,如下:

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、岳塘網(wǎng)絡(luò)推廣、微信平臺(tái)小程序開發(fā)、岳塘網(wǎng)絡(luò)營(yíng)銷、岳塘企業(yè)策劃、岳塘品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供岳塘建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:chinadenli.net
void ZeroSleep()
{
Sleep(0);
}
Sleep(0)作用是用來釋放cpu的時(shí)間片,避免忙等待。于是想當(dāng)然的在linux上實(shí)現(xiàn)為:
void ZeroSleep()
{
msleep(0);
}
但其實(shí)msleep API的源代碼如下:
void msleep(unsigned int msecs)
{
unsigned long timeout = msecs_to_jiffies(msecs) + 1;
while (timeout)
timeout = schedule_timeout_uninterruptible(timeout);
}
如此一來,即使參數(shù)為0,也至少要睡眠一個(gè)jiffies單位的時(shí)間,因此導(dǎo)致嚴(yán)重的性能問題。
該問題的解決方法是:
既然ZeroSleep的目的是釋放cpu資源,那么就可以通過調(diào)用schedule()函數(shù)替換msleep 。而且實(shí)際上msleep本身也是通過調(diào)用schedule_timeout_uninterruptible實(shí)現(xiàn)的,所以這個(gè)做法也是合理的。
在windows.h里面。
在VC中使用時(shí),sleep函數(shù)的頭文件為windows。h,在Linux下,gcc編譯器中,使用的頭文件因gcc版本的不同而不同
在VC中,Sleep中的第一個(gè)英文字符為大寫的"S",在linux下不要大寫,在標(biāo)準(zhǔn)C中是sleep,不要大寫,簡(jiǎn)單的說VC用Sleep,別的一律使用sleep
在VC中,Sleep()里面的單位,是以毫秒為單位,所以如果想讓函數(shù)滯留1秒的話,應(yīng)該是Sleep(1000);在Linux下,sleep()里面的單位是秒,而不是毫秒。
擴(kuò)展資料:
Windows.h頭文件之所重要,是因?yàn)轭^文件封裝了許多庫函數(shù)以及一些類,將一些復(fù)雜的工作由庫函數(shù)處理,Windows.h頭文件中包含了Windef.h、Winnt.h、Winbase.h、Winuser.h、Wingdi.h等頭文件,涉及到了Windows內(nèi)核API,圖形界面接口,圖形設(shè)備函數(shù)等重要的功能。
在C語言家族程序中,頭文件被大量使用。一般而言,每個(gè)C++/C程序通常由頭文件和定義文件組成。頭文件作為一種包含功能函數(shù)、數(shù)據(jù)接口聲明的載體文件,主要用于保存程序的聲明,而定義文件用于保存程序的實(shí)現(xiàn)。
參考資料來源:百度百科-windows.h
開啟一個(gè)局部的事件循環(huán),讓其執(zhí)行100ms后自己退出,似乎很不錯(cuò)。寫來看看:
QEventLoop eventloop;
QTimer::singleShot(100, eventloop, SLOT(quit()));
eventloop.exec();
創(chuàng)建事件循環(huán)
啟動(dòng)定時(shí)器,讓其100ms后觸發(fā)事件循環(huán)的quit()槽
啟動(dòng)事件循環(huán)
后面這種方法可以不影響其他線程的響應(yīng),又可以達(dá)到等待的目的。
在VC中使用帶上頭文件
#include windows.h
( Sleep函數(shù)存放頭文件:WinBase.h)
功 能: 執(zhí)行掛起一段時(shí)間
用 法: void Sleep(DWORD dwMilliseconds);
在gcc編譯器中,使用的頭文件因gcc版本的不同而不同
#include unistd.h
Sleep()單位為毫秒,sleep()單位為秒(如果需要更精確可以用usleep單位為微秒)
返回值
若進(jìn)程/線程掛起到參數(shù)所指定的時(shí)間則返回0,若有信號(hào)中斷則返回剩余秒數(shù)。
當(dāng)前題目:c語言中msleep函數(shù),r語言msa函數(shù)
網(wǎng)站網(wǎng)址:http://chinadenli.net/article25/dsepoci.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、、網(wǎng)站改版、品牌網(wǎng)站制作、虛擬主機(jī)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)