[英]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生成的包裝器有害:
死代碼消除:
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
寄存器分配將在具有大量局部變量的函數中受到不利影響 - 大多數SWIG包裝函數都會受此影響。 盡管如此,很難展示一個簡潔的例子。
另一個例子,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
使用-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.