Флаги по умолчанию Perl Inline::C
Я создал модуль, используя Inline::C, и заметил некоторые неожиданные расхождения в производительности между его запуском на хосте MacOS и гостевой виртуальной машине Linux. Если посмотреть на это, это произошло из-за того, что флаги компилятора 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 не перезаписывает значение по умолчанию, а просто добавляет перед ними, что в конечном итоге не имеет никакого эффекта. Любая идея, откуда берется значение по умолчанию и / или как его перезаписать, чтобы указать уровень оптимизации, который я хочу.
1 ответ
Похоже, что добавление 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
был скомпилирован / собран в системе.