Флаги по умолчанию 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 был скомпилирован / собран в системе.

Другие вопросы по тегам