2017-08-29 62 views
0

我在函數的運行時間中遇到了一個奇怪的問題。考慮以下2種情況:直接調用一個函數比使用bash腳本調用它需要更多的時間

  • 我有一個圖書館libfoo.so,其中有一個功能foo()

    1. 應用程序(如C程序)調用foo() - 需要X時間
    2. 相同的應用程序調用腳本script.sh),調用相同foo() - 需要X/2時間

我通過system("script.sh")調用腳本。

我的意思「運行時間」是操作foo()(例如,如果foo()運行一些環路,則它會在方案1更慢)。

爲什麼中間的腳本比直接調用foo()花費了一半的時間?有沒有辦法繞過這個腳本,並有X/2時間?


編輯:

我寫了一個示例代碼,但我不能重現的時刻。該腳本仍然運行得更快,但只有1%。

//libfoo.h 
void foo(); 

-

//libfoo.c 
#include "libfoo.h" 
#include <stdio.h> 
#include <time.h> 

void foo() 
{ 
    clock_t t; 
    t = clock(); 

    for(unsigned int i=0; i<1000000000; i++); 

    t = clock() - t; 
    double total_time = ((double)t)/CLOCKS_PER_SEC; 

    printf("foo() total time: %f seconds\n", total_time); 
} 

-

//script.sh 
./main_for_script 

-

//main_for_script 
#include "libfoo.h" 

int main() 
{ 
    foo(); 

    return 0; 
} 

-

//main.c 
#include "libfoo.h" 
#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    printf("Calling foo() directly...\n"); 
    foo(); 
    printf("Calling foo() via script...\n"); 
    system("./script.sh"); 
    return 0; 
} 

-

//compilation 
$CC -c -fpic libfoo.c 
$CC -shared -o libfoo.so libfoo.o 
$CC -L. -o main main.c -lfoo 
$CC -L. -o main_for_script main_for_script.c -lfoo 

-

//Running command 
[email protected]:/stackoverflow# ./main 
Calling foo() directly... 
foo() total time: 8.794843 seconds 
Calling foo() via script... 
foo() total time: 8.713951 seconds 
+2

請製作[mcve]。即使您無法在閱讀器機器上重現計時,如果您提供代碼,上下文會變得更加清晰。 – Yunnosch

+1

什麼是'foo()'?它是在[tag:c]這兩種情況下實現的,還是在第二個[tag:bash]中實現?你可以,如果你想在c中實現一個函數,那麼比起「*相同的函數*」,在... [tag:python]中做的事情真的很慢。但是爲了更好地瞭解代碼,應該發佈代碼。 –

+0

您是否已經將此函數作爲「可加載的內置」(不管它的名稱是什麼)發送出去的? –

回答

0

難道是適用於你的程序的資源,當你調用foo是共享的,但專用的,當你調用sh文件形成系統。所以一個運行和調用庫函數(foo)的程序與一個啓動一個帶有.sh文件的程序相同。可能是操作系統和線程相關的問題。

+2

如果不知道'foo()'是什麼,就沒有辦法給出答案。 –

相關問題