2017-07-02 33 views
0

是否可以測量std::system(...)的執行時間?在C++中測量std :: system的實際執行時間

或者,也許函數立即返回,這是不可能的,在這種情況下是否有任何其他方式來衡量分叉程序的執行?

感謝您的任何幫助。

+0

'系統'是關於執行一個命令。假設它是linux,因爲你使用了'fork'。 'system(「time」YOUR_COMMAND)'就足夠了,儘管時間消耗被打印到終端。 – Thiner

+0

如果你想象測量其他子程序一樣測量系統調用時間,你可以轉到'rdtsc' /'gettimeofday'/...(time.h中的'time'是不推薦的,因爲它只能返回當前秒,並沒有用) – Thiner

回答

3

除非你正在尋找一個系統既不是POSIX與SH-像貝殼也不支持Windows,std::system是同步的,返回的結果命令。您可以使用標準的high resolution timer測量牆時間:

#include <chrono> 
#include <cstdlib> 
#include <iostream> 

int main() 
{ 
    auto before = std::chrono::high_resolution_clock::now(); 
    std::system("sleep 3"); 
    auto after = std::chrono::high_resolution_clock::now(); 

    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
     after - before); 

    std::cout << "It took " << duration.count() << " microseconds\n"; 
} 

如果你是在所使用的CPU處理時間量相當感興趣,我不認爲C++有一個標準的,跨平臺的方式提供給你。

+0

感謝您的回答。我的問題實際上是'std :: system'執行得太快。所以,現在我可以測量到底多快:) – CpCd0y

1

它是特定於實現的(因爲AFAIU,C++標準沒有詳細說明std::system使用的命令處理器;該命令處理器可能甚至不運行任何外部進程)。

但讓我們關注Linux(或至少在其他POSIX系統)上的。然後,您可以使用較低級別的系統調用fork(2),execve(2),wait4(2)並使用struct rusage(請參閱getrusage(2)以獲取詳細信息)填充該成功的wait4調用,特別是獲取CPU時間。如果你只想經過真正時間,使用<chrono> C++ facilities(或下級time(7)的東西,如clock_gettime(2) ...)

注意,clock標準C函數提供了有關處理器時間(在電流process)所以不會測量分叉子進程(由std::system)會消耗什麼。

2

試試這個代碼(對於Linux & POSIX),

#include<time.h> 
#include<sys/types.h> 
#include<sys/wait.h> 
#include <iostream> 
#include <cstdlib> 
struct tms st_time; 
struct tms ed_time; 
int main() 
{ 
    times(&st_time); 
    std::system("your call"); 
    times(&ed_time); 
    std::cout<<"Total child process time =" 
      <<((ed_time.tms_cutime - st_time.tms_cutime) 
       +(ed_time.tms_cstime - st_time.tms_cstime))/CLOCKS_PER_SEC; 
} 
+0

不起作用。在POSIX系統上'clock()' - see [clock(3)](http://man7.org/linux/man-pages/man3/clock.3.html)...-給出了當前進程的近似值CPU時間(不包括子進程)。 Windows被稱爲是有缺陷的,因爲它的「時鐘」給出了 - 正確 - 實際使用時間的粗略近似值 –

+0

順便說一句,你的代碼是C,並且OP詢問關於C++ –

+0

即使答案錯誤的版本 –