|
Вопросы о программировании Вопросы, касающиеся программирования на FBD |
|
Опции темы | Поиск в этой теме |
23.12.2018, 19:07 | #1 | |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Оптимизируем программы на с++
Если вы используете программы, написанные на с++ (справедливо не только для контроллеров), то вы можете заметно увеличить их производительность (потребление процессорного времени) безболезненно и бесплатно.
Далее я опубликую простое исследование этого вопроса. 1. Создаём простую программу, которая в цикле умножает 2 числа много раз. Посчитаем время выполнения программы. Код:
long data = 500; long out = 0; unsigned int start_time = clock(); for (int i = 0; i < 10; ++i) { for (long i = 0; i < 5000000; ++i) { out = out + data * i; out = out<<5; } } unsigned int end_time = clock(); unsigned int work_time = end_time - start_time; printf("Результат = %i\n", out); printf("Время работы программы: %i\n", work_time); Код:
Результат = -1329249920 Время работы программы: 1009503 Теперь в makefile добавим следующие флаги: Цитата:
Код:
Результат = -1329249920 Время работы программы: 151775 Резюмирую: Очень рекомендую использовать указанные флаги в своих программах, которые вы делаете для контроллеров, поскольку для встраиваемых систем это очень важно. Есть один недостаток в этой системе: бинарники, скомпилированные с этими флагами будут работать только та таком же устройстве, поскольку они будут использовать все команды конкретного процессора, а не только общие для архитектуры. Пишите, пожалуйста, критику и отзывы. __________________ В сегнетиксе не работаю с самого начала 2019 года. |
|
24.12.2018, 10:39 | #2 | ||
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: Оптимизируем программы на с++
У меня этот способ ускорения вылезает первым по запросу "linux считать математику быстрее"
Для получение наилучшего результата я советую подставить разные ключи оптимизации, бывает так, что -Ofast замедляет программы, а не ускоряет их. Бывает и такое, что -Ofast делает программу неработоспособной, если важна точность вычислений, потому что -Ofast включает в себя ключ -ffast-math - обработка математики с понижением точности. Цитата:
Например, широко известная проблема Цитата:
Мой совет: никогда не использовать -Ofast, а просто использовать -O3, например. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
||
24.12.2018, 11:35 | #3 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: Оптимизируем программы на с++
Вот ты вроде всех агитируешь за анализ ситуации и конкретных случаев, а сам этим не занимаешься.
Это всё, конечно, имеет место быть, но это справедливо только где идет много работы с плавающей запятой, а таких прог не больно то много, при этом, для большинства задач, даже понижение точности используемых дробных чисел не критично (опенгл). А выигрыш от оптимизации весьма существенный. А ещё круто помогает -march=native, целевая архитектура. Даёт прекрасные результаты. __________________ В сегнетиксе не работаю с самого начала 2019 года. |
24.12.2018, 11:51 | #4 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: Оптимизируем программы на с++
Цитата:
Но: 1) Здесь форум по автоматизации, поэтому я всегда даю советы прежде всего с этой позиции. В автоматизации 99.9%, что присутствует хотя бы один датчик и/или регулятор Поэтому 2) Чтобы не гадать, откуда глюки, лучше вообще не использовать упрощённые матбиблиотеки. Не тот объём вычислений в автоматизации, чтобы задумываться на тему оптимизации __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
|
24.12.2018, 11:54 | #5 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: Оптимизируем программы на с++
Разработчики системного меню, о которых теперь либо хорошо, либо ничего, тоже так думали, видимо ))
__________________ В сегнетиксе не работаю с самого начала 2019 года. |
24.12.2018, 12:08 | #6 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: Оптимизируем программы на с++
Сисменю - это не автоматизация. Вероятность, что наши клиенты будут создавать своё сисменю lim x->0.
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
24.12.2018, 12:13 | #7 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: Оптимизируем программы на с++
Тем не менее, проблема комплексная. То не оптимизировали, это не оптимизировали, и здесь лишние ресурсы используют - так и получается, что нет нормального софта и всё тормозит. Справедливо не только для контроллеров. Потому что каждый разработчик думает, типа "ресурсов-то достаточно, да и не так уж много мне тут надо. Подумаешь, программа жрёт в 50 раз больше, чем могла бы, это всё равно мало!"
В материальном мире такие вещи не работают. Покупаешь за рубль коробок спичек - всё хорошо. Но если он будет стоить 50 рублей - тебя это уже "не порадует". Но ведь и рубль, и 50 - это мало. Вопрос лишь в том, что 50 за коробок спичек - это дофига. Почему к программам нет такого же отношения? __________________ В сегнетиксе не работаю с самого начала 2019 года. |
24.12.2018, 12:26 | #8 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: Оптимизируем программы на с++
Сниму шляпу перед автоматчиком, алгоритм которого объективно потребует оптимизации по скорости не из-за говнокода, а из-за объёма вычислений.
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
24.12.2018, 12:57 | #9 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: Оптимизируем программы на с++
Автоматчики здесь же, на этом же форуме, по этим же самым убеждениям используют язык GO! для своих мелких программ... Не знаю, правда, как оно на практике, хватает ли им места... Но это, на мой взгляд, показатель.
__________________ В сегнетиксе не работаю с самого начала 2019 года. |
24.12.2018, 13:06 | #10 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: Оптимизируем программы на с++
__________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
24.12.2018, 18:00 | #11 | |
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: Оптимизируем программы на с++
Цитата:
Без флагов используются переменные на стеке и вычисления соответствуют выражению в исходном коде: Код:
... .L4: movl -16(%rbp), %eax imull -12(%rbp), %eax addl %eax, -4(%rbp) sall $5, -4(%rbp) addl $1, -12(%rbp) cmpl $4999999, -12(%rbp) jle .L4 ... Код:
... .L3: addl %eax, %edx addl $500, %eax sall $5, %edx cmpl $-1794967296, %eax jne .L3 ... |
|
24.12.2018, 18:13 | #12 | |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: Оптимизируем программы на с++
x86 - другая история, это CISC, а не RISC.
Цитата:
Всё честно для x86: размещение данных в регистрах и выполнение одного цикла тактов за 10 с загрузкой пяти модулей конвейера. Выполняться должно почти мгновенно. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. Последний раз редактировалось Arsie, 24.12.2018 в 18:23 |
|
24.12.2018, 18:13 | #13 | |
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: Оптимизируем программы на с++
Проверил с компиляцией в arm -- ситуация аналогичная: используется оптимизация размещения переменных и оптимизация выражения в цикле, умножение не используется.
Добавлено через 2 минуты Не, без разницы здесь. Цитата:
-1794967296 -- это должна быть сумма 1..5000000, помноженная на 500. |
|
24.12.2018, 18:28 | #14 |
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 160
Благодарил(а): 15 раз(а)
Поблагодарили:
665 раз(а) в 607 сообщениях
|
Ответ: Оптимизируем программы на с++
Типа, решил, что отмотать 500 раз больше сложений это быстрее, чем мотать умножения... Нуу... Учитывая, что современные x86 делают два сложения с той же скоростью, что умножение, я прямо не знаю, быстрее это стало или нет.
В конвейере того же кофелейка два целочисленных сумматора/умножителя плюс один сумматор. Если мне память не изменяет. PS. Как бы то ни было, к ключу -ffast-math это отношения не имеет) __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. |
24.12.2018, 18:35 | #15 |
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: Оптимизируем программы на с++
|
25.12.2018, 21:35 | #16 |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Оптимизируем программы на с++
Баян, но мне нравится
www.smart-jokes.org/programmer-evolution.html High School / Junior High 10 PRINT "HELLO WORLD" 20 END First Year in College program Hello(input, output) begin writeln('Hello World') end. Senior Year in College (defun hello (cons 'Hello (list 'World)))) New professional #include void main(void) { char *message[] = {"Hello ", "World"}; int i; for(i = 0; i < 2; ++i) printf("%s", message[i]); printf("\n"); } Seasoned professional #include <iostream.h> #include <string.h> class string { private: int size; char *ptr; public: string() : size(0), ptr(new char('\0')) {} string(const string &s) : size(s.size) { ptr = new char[size + 1]; strcpy(ptr, s.ptr); } ~string() { delete [] ptr; } friend ostream &operator <<(ostream &, const string &); string &operator=(const char *); }; ostream &operator <<(ostream &stream, const string &s) { return(stream << s.ptr); } string &string:perator=(const char *chrs) { if (this != &chrs) { delete [] ptr; size = strlen(chrs); ptr = new char[size + 1]; strcpy(ptr, chrs); } return(*this); } int main() { string str; str = "Hello World"; cout << str << endl; return(0); } Apprentice Hacker #!/usr/local/bin/perl $msg="Hello, world.\n"; if ($#ARGV >= 0) { while(defined($arg=shift(@ARGV))) { $outfilename = $arg; open(FILE, ">" . $outfilename) || die "Can't write $arg: $!\n"; print (FILE $msg); close(FILE) || die "Can't close $arg: $!\n"; } } else { print ($msg); } 1; Experienced Hacker #include <stdio.h> #define S "Hello, World\n" main(){exit(printf(S) == strlen(S) ? 0 : 1);} Seasoned Hacker % cc -o a.out ~/src/misc/hw/hw.c % a.out Guru Hacker % cat Hello, world. ^D Junior Manager 10 PRINT "HELLO WORLD" 20 END Middle Manager mail -s "Hello, world." bob@b12 Bob, could you please write me a program that prints "Hello, world."? I need it by tomorrow. ^D Senior Manager % zmail jim I need a "Hello, world." program by this afternoon. Chief Executive % letter letter: Command not found. To: ^X ^F ^C % help mail help: Command not found. % damn! !: Event unrecognized % logout По теме если рассматривать не только опции компилятора много чего можно предложить http://graphics.stanford.edu/~seander/bithacks.html Arsie: я отредактировал ваш почти нечитаемый код)) __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... Последний раз редактировалось Arsie, 26.12.2018 в 10:53 |
26.12.2018, 13:21 | #17 |
Senior Member
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 761
Благодарил(а): 1 раз(а)
Поблагодарили:
10 раз(а) в 10 сообщениях
|
Ответ: Оптимизируем программы на с++
Спасибо.
Мало времени. В начале ссылка. По ней читаемо. __________________ В жизни 2 правила успеха: 1 Не говори всего что знаешь 2 ... |