Perl Inline::C 默认标志

Perl Inline::C default flags

我使用 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 与 O2,因此我查看了内联文档并使用了:

use Inline (C => Config => ccflags => '-O3');

明确指定-O3。好吧,结果是 -O3 -O2 是那样应用的,所以指定 ccflags 不会覆盖默认值,它只是在 之前添加 它们,最终没有任何效果. 知道默认值来自哪里 and/or 如何覆盖它以指定我想要的优化级别。

似乎添加 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 铸币厂 18.3.

默认值 来自 $Config{optimize},它在 perl 是 compiled/built 时存储为只读默认值系统.