Генерация высококачественного кода для программ, написанных на СИ - [5]
L--------------------------------------------------------------
"Вынесение инвариантного (неизменяющегося) кода" - один из путей ускорения циклов, заключающийся в вынесении выражений за пределы цикла, если значения, ими вычисляемые, являются неизменными во время выполнения цикла. Если инвариантный код выносится из следующего цикла:
>unsigned char i,j,k,v,x;
>for( i = 0; i < v; i++)
> x = i * (j+k);
его логический эквивалент будет:
>T1 = j + k;
>for(i = 0; i < v; i++)
> x = i * T1;
--------------------------------------------------------------¬
¦РИСУНОК 3: Вынесение инвариантного кода - Microsofr C 5.0 ¦
+-------------------------------------------------------------+
¦Исходный текст на Си MICROSOFT COMPUTER INNOVATIONS ¦
¦ C 5.0 C86Plus 1.10 ¦
+-------------------------------------------------------------+
¦for(i4=0;i4<=2;i4++) sub SI,SI mov i4,0 ¦
¦ ivector2[i4] =j*k; mov AX,j jmp L44@2 ¦
¦ imul k L9@2: ¦
¦ mov [BP-4],AL mov AX,j ¦
¦ $L20007: imul k ¦
¦ mov AL,[BP-4] mov SI,i4 ¦
¦ mov ivector2[SI],AL ¦
¦ inc SI mov ivector2[SI],AL¦
¦ cmp SI,2 inc i4 ¦
¦ jle $L20007 L44@2: ¦
¦ mov i4,SI cmp i4,2 ¦
¦ jle L9@2 ¦
+-------------------------------------------------------------+
¦ Вынесение инвариантного кода уменьшает время выполнения ¦
¦ цикла путем вынесения неизменяющихся выражений из тела ¦
¦ цикла. В отличие от Computer Innovations C86Plus 1.10, ¦
¦ компилятор Microsoft C 5.0 успешно выносит выражение j * h ¦
¦ за пределы цикла, так что оно выполняется только один раз, ¦
¦ вместо того, чтобы выполняться на каждой итерации цикла. ¦
L--------------------------------------------------------------
Рис. 3 демонстрирует вынесение инвариантного кода компилятором Microsoft C 5.0.
Дальнейший анализ примера показывает, что значение переменной i, индекса цикла, изменяется непосредственно с каждой итерацией. Отдельное присваивание i, известной как "переменная индукции цикла", может быть удалено:
>T1 = j + k;
>for(x = 0; x< T1 * v; x += T1);
> i = v;
Поскольку использование переменных - индексов цикла во внутренних выражениях цикла общеупотребительно, удаление переменных индукции цикла вместе со связанными с ними "снижениями мощности", может значительно улучшить исполнение программы. Рис. 4 показывает пример удаления переменной индукции цикла.
--------------------------------------------------------------¬
¦РИСУНОК 4: Удаление переменных индукции цикла ¦
+-------------------------------------------------------------+
¦Исходный текст на Си MICROSOFT DATALIGHT ¦
¦ C 5.0 Optimum-C 3.14 ¦
+-------------------------------------------------------------+
¦for(i=0;i<100;i++) mov AX,0 ¦
¦ ivector5[i*2+3]=5; mov i,100 mov i,AX ¦
¦ mov SI,OFFSET ivector5+6 cmp AX,100 ¦
¦ $L20006: jge L134 ¦
¦ mov [SI],5 L11B: ¦
¦ add SI,4 mov BX,i ¦
¦ cmp SI,OFFSET ivector5+406 shl BX,1 ¦
¦ jb $L20006 shl BX,1 ¦
¦ mov ivector+6[BX],5 ¦
¦ inc i ¦
¦ cmp i,100 ¦
¦ jl L11B ¦
¦ L134: ¦
+-------------------------------------------------------------+
¦ Удаление переменных индукции цикла помогает минимизировать ¦
¦ время, проводимое в каждой итерации цикла, путем вынесения ¦
¦ индексирующих цикл переменных (переменных индукции) из ¦
¦ тела цикла. В то время, как компилятор Datalight Optimum-C ¦
¦ использует переменную индукции i для индексации массива ¦
¦ ivector5, компилятор Microsoft C 5.0 удаляет ее благодаря ¦
¦ накоплению смещения для каждого элемента массива и ¦
¦ добавлению результата к базовому адресу массива. ¦
L--------------------------------------------------------------
"Слияние циклов" минимизирует управляющие заголовки циклов путем сращивания кода из циклов, имеющих одинаковые управляющие заголовки, в один цикл. Для того, чтобы удалить управляющий заголовок второго цикла, два простых цикла
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.