簡體   English   中英

C ++優化級別是否會影響Swig Python模塊的性能

[英]Does C++ optimisation level affect Swig Python module performance

我有一個大的Swig Python模塊。 C ++包裝器最終約為320,000 LoC(包括我猜的頭文件)。 我目前使用-O1編譯它,並且g ++生成一個大小為44MiB的二進制文件,並且編譯它需要大約3分鍾。

如果我關閉優化(-O0),二進制文件出現在40MiB,編譯需要44秒。

使用-O0編譯包裝器會顯着損害python模塊的性能嗎? 在我開始分析不同優化級別的模塊性能之前,有沒有人在此之前進行過這種分析,或者對是否重要有任何見解?

-O0取消激活gcc執行的所有優化。 優化很重要。

因此,如果您的應用程序中沒有很多知識,我可能會建議這會損害您的應用程序的性能。

通常安全的優化級別是-O2。

您可以在以下網址查看 GCC執行的優化類型: http//gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

但最后,如果你想確切地知道你應該在不同的級別和配置文件編譯。

無論SWIG模塊與否,這都是不好的。 即使使用gcc -O1也會發生許多優化,如果你阻止它們發生,你會錯過這些優化。

您可以通過檢查由您選擇的編譯器生成的asm來檢查差異。 其中我非常了解的那些對SWIG生成的包裝器有害:

  1. 死代碼消除:

     void foo() { int a = 1; a = 0; } 

    使用-O1這個完全無意義的代碼被完全刪除:

     foo: pushl %ebp movl %esp, %ebp popl %ebp ret 

    而使用-O0則變為:

     foo: pushl %ebp movl %esp, %ebp subl $16, %esp movl $1, -4(%ebp) movl $0, -4(%ebp) leave ret 
  2. 寄存器分配將在具有大量局部變量的函數中受到不利影響 - 大多數SWIG包裝函數都會受此影響。 盡管如此,很難展示一個簡潔的例子。

  3. 另一個例子,gcc的輸出為原型編譯SWIG包裝器:

     int foo(unsigned int a, unsigned int b, unsigned int c, unsigned int d); 

    使用-O0生成:

     Java_testJNI_foo: pushl %ebp movl %esp, %ebp subl $88, %esp movl 16(%ebp), %eax movl %eax, -48(%ebp) movl 20(%ebp), %eax movl %eax, -44(%ebp) movl 24(%ebp), %eax movl %eax, -56(%ebp) movl 28(%ebp), %eax movl %eax, -52(%ebp) movl 32(%ebp), %eax movl %eax, -64(%ebp) movl 36(%ebp), %eax movl %eax, -60(%ebp) movl 40(%ebp), %eax movl %eax, -72(%ebp) movl 44(%ebp), %eax movl %eax, -68(%ebp) movl $0, -32(%ebp) movl -48(%ebp), %eax movl %eax, -28(%ebp) movl -56(%ebp), %eax movl %eax, -24(%ebp) movl -64(%ebp), %eax movl %eax, -20(%ebp) movl -72(%ebp), %eax movl %eax, -16(%ebp) movl -16(%ebp), %eax movl %eax, 12(%esp) movl -20(%ebp), %eax movl %eax, 8(%esp) movl -24(%ebp), %eax movl %eax, 4(%esp) movl -28(%ebp), %eax movl %eax, (%esp) call foo movl %eax, -12(%ebp) movl -12(%ebp), %eax movl %eax, -32(%ebp) movl -32(%ebp), %eax leave ret 

    與僅生成的-O1相比:

     Java_testJNI_foo: pushl %ebp movl %esp, %ebp subl $24, %esp movl 40(%ebp), %eax movl %eax, 12(%esp) movl 32(%ebp), %eax movl %eax, 8(%esp) movl 24(%ebp), %eax movl %eax, 4(%esp) movl 16(%ebp), %eax movl %eax, (%esp) call foo leave ret 
  4. 使用-O1 g ++可以生成更智能的代碼:

     %module test %{ int value() { return 100; } %} %feature("compactdefaultargs") foo; %inline %{ int foo(int a=value(), int b=value(), int c=value()) { return 0; } %} 

簡短的回答是完全禁用優化GCC生成非常天真的代碼 - SWIG包裝器和任何其他程序一樣,如果沒有給出自動生成代碼的樣式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM