Perl Inline :: C默认标志

Ecu*_*dor 7 perl inline-c

我使用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\"
Run Code Online (Sandbox Code Playgroud)

与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\"
Run Code Online (Sandbox Code Playgroud)

我的代码的主要区别是O3 vs O2,因此我研究了Inline文档并使用:

use Inline (C => Config => ccflags => '-O3');
Run Code Online (Sandbox Code Playgroud)

要明确指定-O3。好吧,结果是这样-O3 -O2应用的,因此指定ccflag不会覆盖默认值,它只会在默认值之前添加,最终不会产生任何效果。任何知道默认值的来源和/或如何覆盖默认值以指定所需的优化级别的想法。

ste*_*ieb 6

似乎添加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);
}
Run Code Online (Sandbox Code Playgroud)

这是输出(为简洁起见,略):

之前:

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在系统上编译/构建时,该值存储为只读默认值。