Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Производительность операций - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Морзянка http://www.cyberforum.ru/cpp-beginners/thread387525.html
Всем привет !! Написал программу которая переводит слова в морзянка. Теперь мне надо написать программу которая будет все делать наоборот переводить из морзянки в слова P.S. Моя программа работает...
C++ Математическая функция Составить программу вычисления значения выражения: 1/3 +2 модуль(cos(x-Pi/6)) #include <iostream.h> #include <conio.h> #include <math.h> main() { float x; cout<<"x="; http://www.cyberforum.ru/cpp-beginners/thread387507.html
Секундомер с выводом на экран C++
доброго времени суток. подскажите пожалуйста как сделать секундомер, что бы при нажатии кнопки он остановился пробывал так, оно не работает, та и мили секунды показывает не правильно почему то ...
ООП работа с БД C++
Всем привет! Есть такое задание: Написать программу «Моя записная книжка». Предусмотреть возможность работы с произвольным числом записей, поиска записи по какому-либо признаку (например, по...
C++ что такое перезагрузка http://www.cyberforum.ru/cpp-beginners/thread387491.html
cout<<trololo Что такое << мне определение, перпод жесткий, + еще мы учим с а не с++ . и с меня он вдвойне спрашивает! и что такое перезагрузка, определение плз
C++ Многомерные массивы и функции. Доброго времени суток. Помогите разобраться с задачкой. Дана целочисленная прямоугольная матрица. Определить количество столбцов, не содержащих ни одного нулевого элемента. Характеристикой строки... подробнее

Показать сообщение отдельно
Сыроежка
Заблокирован
21.11.2011, 18:17
Цитата Сообщение от CEBEP Посмотреть сообщение
На самом деле, префиксную и постфиксную форм я сравнивал просто для кучи. я люпблю написать что-нибудь типа
C
1
2
double k = *++currentPoint == '-' ? .1 : 10;
    ++currentPoint;
И мне хотелось знать, выйграл ли я что-то , от того что вынес смещение указателя в отдельню строку. В подобном же контексте мне были нитересны < и !=, часто приходится писать for(int i = 0; i != size; ++i), пока мой эксперимент показал, что именно такая запись работает быстрее всего (хотя надёжнее, хоть и не много, написать for(int i = 0; i < size; ++i). На самом деле, основной интерес для меня сейчас представляют контейнеры. Я часто встречал разные мнения о них. Кто-то ругал итераторы, кто-то наоборот, обращения по индексу. У меня на работе есть один умный и хороший специалист (выиграл всероссийскую олимпиаду по сопромату), который принципиально (не потому что лень изучить), не использует стандартные контейнеры а всегда пишет double* array = new double[length];, прекрасно понимая все минусы подхода, просто не хочет связываться. Я сейчас пишу разбор файла, в котором мне не обойтись без вектора ( я должен считать узлы геометрии объекта, не зная на этапе прочтения, сколько их. ). По этому я прикладываю усилия по изучению стандартных контейнеров, надеясь добиться такого кода на с++, который не уступал бы использованию указателей по производительности.
Сначала что касается вашего примера с объявлением. Опять-таки, вопрос упирается не в то, что быстрее, а какой компилятор генерирует объектный код. Причем разные компиляторы могут генерировать различный код. Я думаю, выигрыш во времени вы получаете не потому, что один код более эффективен другого, а, скорей всего, потому, что в одном случае компилятор обращается к currentPoint через косвенную адресацию, а во втором случае непосредственно обращается к регистру, так как уже успел засунуть значение этого поля в регистр. Но это на самом деле никак не связано с тем, что один вариант более эффективен другого, а связан с конкретным компилятором и с тем, какой объектный код он генерирует.

Что касается операций сравнения, то на Intel процессорах они обычно выполняются с помощью одной машинной команды: CMP или ее вариации. Например,

C++
1
2
cmp AX,BX
je     address
или

C++
1
2
cmp AX,BX
jl     address
Опять-таки все зависит от того, откуда будут извлекаться операнды. Еси как в моем примере в обоих случаях операнды извлекаются с помощью одних и тех же конструкций, то разницы не будут. Ежели а одном случае операнд извлекается из регистра, а в другом с помощью индексированного тобращения к памяти, то естественно будет разница. Но снова повторю, все это зависит от конкретного компилятора и режима компиляции. Разные компиляторы могут шенерировать разный объектный код. И то, что для одного компилятора может работать быстрее, для другого компилятора может работать медленнее. Ситуация вообще может кардинально измениться, если с одного микропроцессора вы перейдете на другой микропроцессор, так как у них могут быть разные наборы команд.

Что касается вашего знакомого, то это сразу же говорит о том, что он - не профессионал. Его представления об эффективности крайне наивны, так как ему постоянно самому надо писать код по управлению памятью. А это означает, что он может допустить ошибки, и его код не будет столь эффективен, как уже выверенный код для контейнеров. Более того его код может быть вообще не безопасным! Я уж не говорю о сопровождении такого кода другими людьми.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru