`

СПЕЦИАЛЬНЫЕ
ПАРТНЕРЫ
ПРОЕКТА

Архив номеров

Как изменилось финансирование ИТ-направления в вашей организации?

Best CIO

Определение наиболее профессиональных ИТ-управленцев, лидеров и экспертов в своих отраслях

Человек года

Кто внес наибольший вклад в развитие украинского ИТ-рынка.

Продукт года

Награды «Продукт года» еженедельника «Компьютерное обозрение» за наиболее выдающиеся ИТ-товары

 

Эффективность компиляторов. Сравнительный тест

0 
 

Рынок программных продуктов изобилует разнообразными средствами разработки прикладного ПО, и их выбор во многом предопределяет успех программного проекта. В статье представлены результаты тестирования эффективности компиляторов и сред разработки для языков Fortran, Pascal, C и Basic для некоторых основных операционных систем и аппаратных платформ, полученные на подготовленных автором задачах.

Ограничимся рассмотрением исключительно ресурсоемких вычислительных задач, ориентированных преимущественно на расчеты с плавающей точкой. При этом быстродействие вычислений и адресации памяти будем считать одним из наиболее существенных требований, предъявляемых к разрабатываемому ПО. В качестве критерия эффективности примем условный рейтинг R, который будет определяться как величина, обратно пропорциональная времени выполнения программы. Используя выбранный критерий, мы на нескольких тестовых программах попытаемся сравнить:
  • разные версии продуктов одной и той же компании-разработчика;
  • версии компиляторов, которые разработаны одной компанией как для разных ОС (например Delphi для Windows и Kylix для Linux от Borland), так и для одной ОС, но различных языков программирования;
  • компиляторы разных разработчиков;
  • эффективность результатов компиляции одного и того же алгоритма при использовании различных языков программирования;
  • быстродействие выполнения тестовых примеров при использовании статических и динамических переменных;
  • быстродействие этих тестов на процессорах разных производителей (Intel, AMD, Cyrix).
Для установления рейтинга разных компиляторов автором были разработаны две тестовые программы. Оригинальные тестовые примеры позволяют определять структуру теста и обеспечивают полученным результатам бoльшую применимость к реальным приложениям.


Особенности алгоритмов тестирования

Эффективность компиляторов. Сравнительный тест
Эффективность компиляторов. Сравнительный тест
Эффективность компиляторов. Сравнительный тест
Эффективность компиляторов. Сравнительный тест
Эффективность компиляторов. Сравнительный тест
Эффективность компиляторов. Сравнительный тест
Эффективность компиляторов. Сравнительный тест
Первая тестовая программа предназначена для оценки собственно эффективности вычислений. Она реализует итерационный алгоритм решения дифференциального уравнения Пуассона в прямоугольной области. Расчетная область покрывалась однородной прямоугольной сеткой и интегрировалась методом последовательных приближений (итераций) до достижения необходимой точности. Этот пример является весьма подходящим для целей данного тестирования благодаря симметричной структуре решаемого дифференциального уравнения и расчетной области, что дает возможность избежать чувствительности расчетов к реализации способа размещения данных в массивах, принятого в компиляторах с различных языков программирования. Кроме того, подобная чувствительность ликвидируется после организации двухэтапного обхода внутренних точек: на первом этапе все точки последовательно перебираются вдоль строк, а на втором -- вдоль столбцов. С другой стороны, симметричность решаемого дифференциального уравнения создает благоприятные условия для использования возможностей кэш-памяти и алгоритмов предсказания переходов, присущих процессорам 6-го и 7-го поколений.

Вторая программа была разработана для оценки, в первую очередь, быстродействия адресации оперативной памяти. Для этой цели использовались два одинаковых двумерных действительных массива A и B с равной четной размерностью по обоим направлениям, которые заполнялись данными, генерируемыми случайным образом. Квадратные матрицы A и B были разделены на четыре равные "квадранта" (A11, A12, A21, A22) и (B11, B12, B21, B22) соответственно. Затем строки массива A11 (слева направо, сверху вниз) поэлементно переносились в столбцы массива B22 (снизу вверх, справа налево). Далее столбцы массива B11 (сверху вниз, слева направо) поэлементно переносились в строки массива A22 (справа налево, снизу вверх). Вместе с этим столбцы массива A22 (снизу вверх, справа налево) поэлементно переносились в строки массива B11 (слева направо, сверху вниз). И, в конце концов, строки данных массива B22 (справа налево, снизу вверх) поэлементно переносились в столбцы массива A11 (сверху вниз, слева направо). Все эти перемещения выполнялись одно за другим во вложенном двойном цикле, который повторялся наперед заданное количество раз, что имитирует итерационный процесс постепенного уточнения решения, традиционный для многих численных методов. При таком подходе последовательно выполняются операции чтения-записи, причем осуществляются обращения к расположенным в разных местах элементам столбцов и строк массивов A и B. С целью уравнять возможности компиляторов с разной организацией расположения элементов двумерного массива в оперативной памяти с точки зрения эффективности выборки данных здесь, как и в первом вычислительном тесте, был предусмотрен второй этап, отличающийся от описанной выше последовательности действий лишь измененным порядком индексов в двойном вложенном цикле, что приводит к замене строк на столбцы и наоборот. В отличие от предыдущего теста способ выборки и записи данных был преднамеренно организован так, чтобы создать наиболее неблагоприятные условия для их кэширования. Этим достигается определенная объективность тестирования быстродействия работы именно оперативной памяти.


Стратегия программирования, тестирования и оценки полученных результатов

Для обеспечения возможности корректного сопоставления результатов тестирования необходимо прежде всего согласовать задействованные в разных реализациях алгоритмов тестирования переменные по типу и длине. В качестве типов элементов массивов были использованы: single (в Pascal), float (в С), real (в Fortran) (все -- длиной 4 байта). Каждый из двух описанных выше тестов имел две версии, в первой из которых выделялись статические массивы, а во второй -- динамические. Размерность массива, предназначенного для хранения расчетных значений первого теста, выбрана равной 96 x 96. При 4-байтовой длине элементов этот массив займет в оперативной памяти 36 KB, что примерно в 1,8 раза меньше, чем размер кэш-памяти L2 процессора VIA C3 (64 KB), и в 3,6 раза меньше, чем L2-кэш у Celeron Coppermine (128 KB). Такое соотношение и особенности алгоритма обеспечивают благоприятные условия для эффективного использования кэш-памяти в данном тесте. Размерность массивов A и B для следующего теста была выбрана 1000 1000, что для их размещения в ОЗУ требует 7,63 MB. Этот объем будет в 15 раз превышать наибольший из размеров кэш-памяти процессоров Pentium III Tualatin и Pentium 4 (512 KB). Количество итераций описанной выше последовательности действий принято равным 40. Таким образом, основная нагрузка в этом тесте будет приходиться именно на средства адресации оперативной памяти.

При компиляции тестов с целью увеличения производительности выключались все опции отладки (Debug) и параметры, которые обеспечивают контроль программы в ходе ее выполнения. Кроме того, включались все имеющиеся ключи оптимизации, направленные на повышение быстродействия выполнения результирующего "exe"-файла. Каждый из описанных выше тестов заканчивался вычислением рейтинга R по формуле

Эффективность компиляторов. Сравнительный тест,

где T -- время выполнения полного цикла вычислений, а C -- коэффициент пропорциональности, значение которого задается из соображений удобства. В данном исследовании были выбраны C1=1693 -- для первого теста и C2=3159 -- для второго. Первое из этих значений подбиралось для теста, откомпилированного в среде программирования Delphi 3, так, чтобы при выполнении его под управлением ОС Windows 2000 значение R при подстановке времени T в секундах равнялось бы тактовой частоте процессора (Celeron 1300 MHz), избранном для проведения тестирования. В пользу такого выбора говорит тот факт, что выполненные вычислительные тесты для компилятора Delphi 3 для процессоров Pentium II и Pentium III с любыми соответствующими чипсетами от Intel дали значение R, очень близкое к тактовой частоте.

Тест эффективности адресации RAM продемонстрировал ожидаемую сильную зависимость результатов от частоты шины FSB и обнаружил существенно худшие масштабируемость и универсальность, нежели вычислительный тест. По этой причине выбор коэффициента пропорциональности C2=3159 для него в большей степени произволен, чем в первом случае. Кроме того, оба теста проявили существенную зависимость от избранного языка программирования, а также от компилятора. Так или иначе бoльшие значения R отвечают лучшей производительности, меньшие -- худшей.

При проведении исследования были использованы компиляторы с четырех языков -- Basic, Fortran, Pascal и C, которые широко применяются специалистами самого разного профиля.

Каждый из тестов повторялся по 5 раз, после чего вычислялось среднее арифметическое значение рейтинга R. Именно эта величина и принималась за основной количественный показатель выполнения теста и использовалась для сравнительной характеристики.


Результаты тестирования

Описание полученных результатов начнем со сравнительной оценки компиляторов на компьютере, использованном для тестирования.

Конфигурация тестовой системы

Процессор
Intel Celeron 1300 MHz
Материнская плата ASUS TUSL2-C (i815EP-T)
RAM 256 МВ SDRAM PC-133 HYUNDAI (CLS3)
Базовая ОС Windows 2000

Одна из причин выбора такой конфигурации заключалась в том, что подобная система обладает производительностью, сопоставимой в ряде случаев с эффективностью топ-моделей, при значительно меньшей суммарной стоимости и потому является удобной "точкой отсчета" при сравнении компиляторов.


Общее сравнение

Для удобства анализа компиляторы объединены в группы по языкам программирования. Используем этот же принцип классификации и при анализе полученных результатов.

Наилучшие по вычислительной производительности (рис. 1) результаты принадлежат продуктам Intel: Fortran Compiler 7, 2002 г. для Linux R=2432) и Windows (R=2297), а также Compaq Visual Fortran 6.6 (а, b), 2002 г. (R=2013). Непосредственно за ними идут Digital Fortran Compiler 4.5, 1996 г. (R=1641) и Lahey/Fujitsu Fortran 95 5.70b, 2002 г. (R=1613). Действительно, язык программирования Фортран продолжает динамично развиваться и уверенно лидирует в скорости вычислений.

Следом за компиляторами c Фортрана в вычислительных тестах идут компиляторы с языков С/С++. И здесь продукты от Intel -- непревзойденные лидеры. Чемпионом в гонке С-компиляторов стал Intel С++ Compiler 6, 2002 г. для Linux (R=1885). Его собрат для Windows и преемники седьмой версии показывают немного худшие результаты, хотя отставание от лидера не превышает 3,3%. Следует отметить, что компиляторы Intel имеют мощные опции для распараллеливания программного кода, в частности циклических операций, а также использования SSE-инструкций. Именно активизация этих средств выводит компиляторы от Intel на первое место. К примеру, если сравнивать описанные выше результаты для шестой и седьмой версий Intel Compiler и предшественника -- Intel Compiler версии 4.5, 2000 г., налицо резкий скачок производительности на 14% для теста на С и 52% -- для Фортрана.

Второе место по вычислительной производительности среди С-компиляторов уверенно делят Microsoft Visual C++ 7, 2001 г. (R=972) и Borland Kylix 3, 2002 г. (R=955). Здесь интересно отметить, что если предыдущая шестая версия Microsoft Visual C++ показывает результат, очень близкий к седьмой (R=961), то первый продукт от Borland, позволяющий разрабатывать программы на С++ в Linux, оказался производительнее своего Windows-собрата Borland C++ Builder 6, 2002 г. (R=724) на 32%. Компиляторы С++ различных версий для Windows от Borland демонстрируют похожую производительность, отличающуюся в худшую сторону от рейтинга шестой версии не более чем на 6%, и занимают третье место в этой языковой группе. Завершает список претендентов на лидерство в данном тесте язык Pascal.

В числе различных систем программирования, реализующих этот язык, следует отметить Delphi 2, 1996 г. (R=1311) и Delphi 3, 1997 г. (R=1308) как среды, которые обеспечивают наиболее эффективный с точки зрения быстродействия результат компиляции. Использование последующих версий Delphi (от четвертой до седьмой -- R=773) приводит к уменьшению быстродействия вычислительного теста приблизительно на 69% по отношению к Delphi 2/3. Близкие результаты к последним релизам Delphi показывает и Pascal версий Kylix 1--3, 2001--2002 г. (R=768), а также свободно распространяемый и существующий для различных ОС компилятор FreePascal 1.06, 2002 г. (R=727 -- для Windows и R=691 -- для Linux).

Наихудшие результаты продемонстрировал Microsoft Visual Basic 6, 1998 г. (R=28). Производительность откомпилированного в нем вычислительного теста в 24--86 раз меньшая, чем результаты других компиляторов.

С тестом эффективности адресации памяти (рис. 2) все исследованные компиляторы за исключением опять же Microsoft Visual Basic 6 (R=98) справились весьма успешно, показав примерно одинаковую производительность исполняемого кода. Наилучший (R=1189 -- Kdevelop C++ 1.41, 2001 г.) и наихудший (R=959 -- Absoft C++ 8.0, 2002 г.) рейтинги были получены для Linux. Таким образом, различие результатов для этого теста не превышает 24%. Выбрать лидера в этом тесте достаточно трудно ввиду высокой однородности результатов и разброса (около 7%) при повторных запусках. Отстающий же налицо -- производительность теста адресации памяти, откомпилированного в Microsoft Visual Basic 6, составляет лишь 10,2% от самого худшего показателя. По этой причине было принято решение "снять с дистанции" Visual Basic в дальнейших испытаниях. Кроме того, для последующих тестов с целью большей наглядности результатов число компиляторов было уменьшено.


Сравнение эффективности статической и динамической моделей данных

Результаты сравнения работы вычислительного теста для этих двух моделей данных представлены на рис. 3 и 4. Как видно, высокоэффективные компиляторы Intel Fortran обеспечивают большую производительность коду, основанному на статической модели (до 20%), а вот Delphi, Kylix 3 (Pascal), Kdevelop лучше работают с динамическими переменными. В тесте адресации RAM практически все исследованные компиляторы за исключением FreePascal, Microsoft C++, Delphi 7 и Kylix также обеспечили бoльшую эффективность именно с использованием динамических переменных (до 5%). Вот уж действительно, результат, противоречащий расхожим представлениям о том, что динамические данные обрабатываются медленнее статических. Правда, в других задачах ситуация для любого из рассмотренных здесь компиляторов может измениться.


Сравнение эффективности тестов в разных ОС

В большинстве случаев использовались варианты тестов, основанные на статической модели данных. Лишь в тестах адресации памяти для компиляторов Intel C++ Compiler применены динамические переменные, что обусловлено желанием ответить на вопрос, сходны ли тенденции изменения производительности тестов в случае смены ОС при использовании статических и динамических переменных. Тесты запускались в различных ОС Windows на ядрах 9x (95 OSR2, 98 SE, Millennium) и NT (NT 4, 2000, XP), а также в нескольких версиях Linux (Mandrake-8, 9, Red Hat 7.x, 8.0, ASP 7.3). Была установлена хорошая повторяемость результатов для разных версий Windows в пределах одного и того же ядра. Кроме этого, отмечена нечувствительность тестов к релизу Linux. По данной причине окончательные результаты, представленные на рис. 5 и 6, получены c использованием Windows 2000, Windows Millennium и Linux Mandrake 9.0. Вычислительный тест, как это следует из рис. 5, не демонстрирует преимуществ ни одной ОС для всех исследуемых компиляторов за исключением Intel Fortran Compilers 6/7, которые обеспечивают тесту под Linux преимущество в 6% по сравнению с любой из ОС Windows. Тест эффективности адресации памяти показал, что если результаты для Windows NT и Linux примерно сопоставимы, то в случае Windows 9x для подавляющего большинства компиляторов имеет место систематическое снижение производительности вплоть до 20%. Этот результат свидетельствует о том, что механизмы работы с памятью у ОС Windows 9x в целом менее совершенны, чем у NT и Linux.


Сравнение продуктивности компиляторов на платформах Intel, AMD и VIA

Таблиця 3. Режими компiляцii
Для данного теста использовались компьютеры с процессорами Pentium, K-6, K-7 и VIA C3. Процессорам Athlon компания AMD уже давно назначает некий рейтинг, являющийся мерой их интегральной производительности. Поэтому одной из наиболее существенных здесь является проблема унификации результатов. В данном исследовании производительность поставлена в соответствие реальной частоте, на которой работает процессор. Применительно к вычислительным задачам такой шаг имеет достаточно много оснований. Для проверки его рациональности были отобраны три компилятора -- Compaq Visual Fortran 6.5, Microsoft Visual C++ 6 и Delphi 3. Подготовленные с их помощью вычислительные тесты запускались на различных процессорах нескольких поколений (от Pentium 166 MHz и К6-II 300 MHz до Pentium 4 3,06 GHz и Athlon 3200+). По результатам замеров строились зависимости рейтинга R от частоты процессора для каждого из использованных компиляторов (рис. 7). Как показано на рисунке, полученные зависимости имеют ряд линейных участков. Для процессоров Intel зависимости сохраняют линейность по мере наращивания частоты и смены ядер модельного ряда Pentium, Pentium II, Pentium III, то есть до 1400 MHz. Затем на графиках для каждого из процессоров наблюдается резкий скачок вниз, отражающий изменения в ядре Pentium 4, приведшие к упрощению FPU в сравнении с его предшественниками, после чего, начиная с частоты 1500 MHz и вплоть до 3,06 GHz, зависимости опять практически линейны. В случае процессоров VIA C3 опять имеем линейные зависимости во всем диапазоне их частот (700--933 MHz). Для CPU компании AMD начиная с 600 MHz (процессор AMD К7 с наименьшей частотой, который был доступен автору) и вплоть до 2250 MHz (максимальная частота процессоров Athlon) зависимости производительности вычислений от частоты практически строго линейны. Таким образом, можно заключить, что разработанный вычислительный тест хорошо подходит для оценки масштабируемости производительности FPU, и последняя является линейной функцией от частоты процессора, в том числе и для Athlon. Кроме того, рис. 7 свидетельствует, что Compaq Visual Fortran 6.5 извлекает максимум преимуществ в сравнении с Delphi 3 и Microsoft Visual C++ 6 из любой процессорной микроархитектуры. Compaq Visual Fortran 6.5 и Delphi 3 лучше адаптированы для процессоров Pentium--Pentium III в сравнении с AMD при одинаковых частотах, однако соревнование Athlon vs. Pentium 4 уже не будет в пользу последнего для этих сред программирования. С Microsoft Visual C++ 6 ситуация выглядит иначе. Эта среда программирования оказалась просто "заточена" под Athlon -- во всем интервале рассмотренных частот показатели для процессоров AMD существенно выше, чем для процессоров Intel. А вот данные, полученные для процессора VIA C3, подтверждают давно уже известный факт -- этот процессор плохо приспособлен для вычислений. Построенные для него графики располагаются (вне зависимости от компилятора) значительно ниже, чем для процессоров-конкурентов.


Заключение

Таким образом, каждая процессорная микроархитектура имеет свои сильные и слабые стороны. Грамотный выбор компилятора способствует реализации всей процессорной мощи каждой из существующих моделей. Полученные результаты позволяют обоснованно выбрать компилятор для задач, в которых быстродействие является одним из важнейших требований.
0 
 

Напечатать Отправить другу

Читайте также

 
 
IDC
Реклама

  •  Home  •  Рынок  •  ИТ-директор  •  CloudComputing  •  Hard  •  Soft  •  Сети  •  Безопасность  •  Наука  •  IoT