Оптимизация подразделения в gcc

Различие - это:

Int32.Parse() и Int32.TryParse() может только преобразовать строки. Convert.ToInt32() может посещать любой урок, который реализует IConvertible. Если Вы передаете его строка, то они эквивалентны, за исключением того, что Вы становитесь дополнительными служебный для сравнений типов, и т.д. Если Вы преобразовываете строки, то TryParse(), вероятно, более оптимальный вариант.

9
задан Steve Jessop 8 August 2010 в 17:08
поделиться

4 ответа

Я предполагаю, что это просто очень старая версия GCC, которую вы используете. Самый старый компилятор, который у меня есть на моей машине - gcc-4.1.2, работает быстро как с неконстантной, так и с оберткой версиями (и делает это только с -O1).

я предполагаю, что это просто очень старая версия GCC, которую вы используете. Самый старый компилятор, который у меня есть на моей машине - gcc-4.1.2, работает быстро как с неконстантной, так и с оберткой версиями (и делает это только с -O1).

Я предполагаю, что это просто очень старая версия GCC, которую вы используете. Самый старый компилятор, который у меня есть на моей машине - gcc-4.1.2, работает быстро как с неконстантной, так и с оберткой версиями (и делает это только с -O1).

6
ответ дан 4 December 2019 в 23:07
поделиться

Попробуйте объединить const int v в вашем классе WrappedInt с const T в вашей функции fizzbuzz и посмотрите, компилятор может это оптимизировать.

Объявив const int , вы создали особый случай - константу времени компиляции. Компилятор знает, что это за значение,

1
ответ дан 4 December 2019 в 23:07
поделиться

Существует ли известный способ упаковки int, чтобы компилятор мог отказаться от упаковки при оптимизации?

Попробуйте передать WrappedInt по значению. Затем WrappedInt могут быть переданы в регистры. Передача константной ссылки иногда заставляет gcc откатиться к стеку для передачи аргументов.

Что касается замедления int vs const int , я могу только предположить, что GCC - это пытаясь перестраховаться перед лицом алиасинга. По сути, если он не может доказать, что div не является псевдонимом для другой, более доступной переменной, он не может превратить его в константу. Если вы объявите его константой, GCC предполагает, что он не имеет псевдонима, и выполнит преобразование в константу. Помимо idivl , вы также должны увидеть выборку из памяти, один раз при входе в функцию,

0
ответ дан 4 December 2019 в 23:07
поделиться

Разница в скорости вызвана тем, что компилятор не знает, изменит ли значение "div". Когда он не является константой, он обрабатывает его как передаваемую переменную. Это может быть что угодно, поэтому компилятор будет использовать инструкцию, которая делит две переменные - idivl. Когда вы говорите, что это const, компилятор может обрабатывать его точно так же, как если бы вы набрали:

if (i  % 3 == 0)

Я немного удивлен, что он не использовал побитовое И (&).

WrappedInt isn ' t оптимизируется, потому что это не int. Это класс.

Что-то, что вы могли бы сделать, - это включить fizzbuzz в WrappedInt.

0
ответ дан 4 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: