Различие - это:
Int32.Parse()
и Int32.TryParse()
может только преобразовать строки. Convert.ToInt32()
может посещать любой урок, который реализует IConvertible
. Если Вы передаете его строка, то они эквивалентны, за исключением того, что Вы становитесь дополнительными служебный для сравнений типов, и т.д. Если Вы преобразовываете строки, то TryParse()
, вероятно, более оптимальный вариант.
Я предполагаю, что это просто очень старая версия GCC, которую вы используете. Самый старый компилятор, который у меня есть на моей машине - gcc-4.1.2, работает быстро как с неконстантной, так и с оберткой версиями (и делает это только с -O1).
я предполагаю, что это просто очень старая версия GCC, которую вы используете. Самый старый компилятор, который у меня есть на моей машине - gcc-4.1.2, работает быстро как с неконстантной, так и с оберткой версиями (и делает это только с -O1). Я предполагаю, что это просто очень старая версия GCC, которую вы используете. Самый старый компилятор, который у меня есть на моей машине - gcc-4.1.2, работает быстро как с неконстантной, так и с оберткой версиями (и делает это только с -O1). Попробуйте объединить const int v
в вашем классе WrappedInt с const T
в вашей функции fizzbuzz и посмотрите, компилятор может это оптимизировать.
Объявив const int
, вы создали особый случай - константу времени компиляции. Компилятор знает, что это за значение,
Существует ли известный способ упаковки int, чтобы компилятор мог отказаться от упаковки при оптимизации?
Попробуйте передать WrappedInt
по значению. Затем WrappedInt
могут быть переданы в регистры. Передача константной ссылки иногда заставляет gcc откатиться к стеку для передачи аргументов.
Что касается замедления int
vs const int
, я могу только предположить, что GCC - это пытаясь перестраховаться перед лицом алиасинга. По сути, если он не может доказать, что div
не является псевдонимом для другой, более доступной переменной, он не может превратить его в константу. Если вы объявите его константой, GCC предполагает, что он не имеет псевдонима, и выполнит преобразование в константу. Помимо idivl
, вы также должны увидеть выборку из памяти, один раз при входе в функцию,
Разница в скорости вызвана тем, что компилятор не знает, изменит ли значение "div". Когда он не является константой, он обрабатывает его как передаваемую переменную. Это может быть что угодно, поэтому компилятор будет использовать инструкцию, которая делит две переменные - idivl. Когда вы говорите, что это const, компилятор может обрабатывать его точно так же, как если бы вы набрали:
if (i % 3 == 0)
Я немного удивлен, что он не использовал побитовое И (&).
WrappedInt isn ' t оптимизируется, потому что это не int. Это класс.
Что-то, что вы могли бы сделать, - это включить fizzbuzz в WrappedInt.