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 时存储为只读默认值系统.
我使用 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 时存储为只读默认值系统.