Весьма часто в чужом коде встречаю примерно следующее:
for(int i = 0; i < container.GetLength(); i++)
{
...
container[i] = ...
...
}
Не ошибаюсь ли я считая, что такое удобное использование GetLength() вредит производительности? Ведь выражение "i < container.GetLength()" пересчитывается на каждой итерации.
Здравствуйте, lfpw_, Вы писали:
_>Весьма часто в чужом коде встречаю примерно следующее:
_>for(int i = 0; i < container.GetLength(); i++) _>{ _> ... _> container[i] = ... _> ... _>}
_>Не ошибаюсь ли я считая, что такое удобное использование GetLength() вредит производительности? Ведь выражение "i < container.GetLength()" пересчитывается на каждой итерации.
_>Спасибо.
вредит, но зависит от реализации getlength
как вариант:
for (int i = container.getlength(); --i >= 0; )
container[i] = ...
Здравствуйте, Alex Dav, Вы писали:
A>>>for(int i = 0, e = cont.GetLength(); i < e; ++i) А>>>{ А>>> cont[i] = ..... А>>>} А>>> AD>в то что и надо — cont.GetLength() вызовется один раз
из оригинала в приведенный выше — нет. вызываться getlength будет на каждой итерации цикла
Здравствуйте, sux, Вы писали:
sux>сравнение с нулем работает быстрее чем сравнение со значением в ячейке памяти
На x86 в зависимости от процессора сравнение может работать и быстрее, и так же, и медленнее. А быстрее работает модификация операнда / анализ результата на ноль/знак/etc.
sux>p.s. шутка
В каждой шутке...
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[7]: Насколько оправдан данный вызов в цикле?
От:
Аноним
Дата:
26.02.07 16:26
Оценка:
Здравствуйте, Alex Dav, Вы писали:
AD>Здравствуйте, sux, Вы писали:
sux>>Здравствуйте, Alex Dav, Вы писали:
А>>>>
А>>>>for(int i = 0, e = cont.GetLength(); i < e; ++i)
А>>>>{
А>>>> cont[i] = .....
А>>>>}
А>>>>
AD>>>а разве компилятор не оптимизирует такой вызов?
sux>>во что?
AD>в то что и надо — cont.GetLength() вызовется один раз
Для этого компилятор должен быть уверен, что кол-во элементов контейнера не меняется в процессе выполнения цикла. Но опять же, это будет compiler-specific и почва для еще одного холи-вара на тему "какой компилер круче"
AD>>>>а разве компилятор не оптимизирует такой вызов? sux>>>во что? AD>>в то что и надо — cont.GetLength() вызовется один раз А>Для этого компилятор должен быть уверен, что кол-во элементов контейнера не меняется в процессе выполнения цикла.
Для начала, афайк, компилятор должен быть уверен, что эта функция возвращает кол-во элементов контейнера...
А>Для этого компилятор должен быть уверен, что кол-во элементов контейнера не меняется в процессе выполнения цикла. Но опять же, это будет compiler-specific и почва для еще одного холи-вара на тему "какой компилер круче"
Но ведь как я понял рассматривается эфективность кода, а не его правильность, а эфективность надо совместно с компилом глядеть.
Здравствуйте, ДимДимыч, Вы писали:
ДД>На x86 в зависимости от процессора сравнение может работать и быстрее, и так же, и медленнее. А быстрее работает модификация операнда / анализ результата на ноль/знак/etc.
jnz/jz и имелось ввиду
Re[7]: Насколько оправдан данный вызов в цикле?
От:
Аноним
Дата:
27.02.07 07:32
Оценка:
Здравствуйте, Alex Dav, Вы писали:
AD>в то что и надо — cont.GetLength() вызовется один раз
На спичках экономим...
Здравствуйте, sux, Вы писали:
ДД>>На x86 в зависимости от процессора сравнение может работать и быстрее, и так же, и медленнее. А быстрее работает модификация операнда / анализ результата на ноль/знак/etc.
sux>jnz/jz и имелось ввиду
Одна jcc погоды не сделает. Ньюанс вот:
первый вариант:
inc eax
cmp eax,CONST
jbe LOOP_START
и второй:
dec eax
jnz LOOP_START
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, sux, Вы писали:
ДД>>>На x86 в зависимости от процессора сравнение может работать и быстрее, и так же, и медленнее. А быстрее работает модификация операнда / анализ результата на ноль/знак/etc.
sux>>jnz/jz и имелось ввиду
ДД>Одна jcc погоды не сделает. Ньюанс вот: ДД>первый вариант: ДД>