我使用Inline :: C制作了一个模块,并且注意到在主机MacOS和来宾Linux VM上运行该模块之间存在一些意外的性能差异。研究它,是由于默认的C编译器标志不同。在MacOS上,它们似乎是:
-fno-common -DPERL_DARWIN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -O3 -DVERSION=\"0.00\" -DXS_VERSION=\"0.00\"
与Centos 7相比:
-fPIC -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2 -O2 -DVERSION=\"0.00\" -DXS_VERSION=\"0.00\"
我的代码的主要区别是O3 vs O2,因此我研究了Inline文档并使用了:
use Inline (C => Config => ccflags => '-O3');
要明确指定-O3
。好吧,结果就是这样-O3 -O2
应用的,因此指定ccflag不会覆盖默认值,它只会在默认值之前添加,最终不会产生任何效果。任何关于默认值的来源和/或如何覆盖它以指定所需的优化级别的想法。
似乎添加optimize
配置选项可以完成您想要的操作。这是一个非常简短的示例,其中包含添加之前optimize => '-O3'
和之后的输出:
use warnings;
use strict;
use Inline 'C';
use Inline C => 'Config',
build_noisy => 1,
force_build => 1,
optimize => '-O3',
;
print add(5, 6);
__END__
__C__
int add (int x, int y){
return(x + y);
}
这是输出(为简洁起见,略):
之前:
cc -c -I"/home/steve/scratch/inline" -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2
后:
cc -c -I"/home/steve/scratch/inline" -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O3
...在Linux Mint 18.3上。
默认值来自$Config{optimize}
,perl
在系统上编译/构建时,该值存储为只读默认值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句