Яндекс.Метрика
Поиск по тегу

Си


Найдено: 4 записи

Ни о чём

Я хочу работать в Google! Телефонное интервью (часть 2)

Сегодня мы будет обсуждать технические аспекты и реализацию задач на Python и C/C++, которыми нас будет закидывать инженер из Google. Начнём с самых тривиальных проблем с последующим нарастанием сложности. Параллельно обратим внимание о чём стоит упомянуть во время интервью и где не попасть в ловушку.

Ни о чём

История языка Си

Сейчас, наверно, невозможно найти в мире специалиста в IT-области, который бы не слышал о языке Си. Этот язык приобрёл огромную популярность во всём мире и оказал значительное влияние на многие другие языки программирования. Именно он является предшественником таких языков, как C++, C#, Java; менее известных (например J#). Компания Microsoft для разработки родного языка к своей платформе .Net выбрала именно Си-подобный синтаксис. Что ни говори, но язык Си серьезно изменил жизнь программистов прошлого века и стал де-факто в области низкоуровневого программирования, оставив ассемблеру только те места, где производительность имела критическое значение.

Многие помнят имена создателей языка — Кена Томпсона и Дениса Ритчи, но я решил копнуть глубже и вспомнить историю создания и развития языка. Всем кому интересна эта тема — добро пожаловать под кат.

Ни о чём

Тест Си компиляторов под Windows

После многочисленных споров на тему «Какой компилятор лучше генерирует код», появилась идея провести самому испытания. Основной целью испытания была проверка скорости работы программы с оптимизацией по скорости. Результат тестирования: среднее арифметическое время выполнения тестовой функции в миллисекундах (1/1000 сек). т.е. чем меньше тем лучше.

В тестировании участвовали:
  • Intel C++ Compiler Pro 11.1.054;
  • GCC 4.5.0 (MinGW);
  • MS C/C++ Compiler 15.00.21022.08 (VS 2008);
  • CodeGear C++ Builder 11.0 (C++Builder 2007);
  • Tiny C Compiler 0.9.25.
Железо для теста:
  • Компьютер: CPU Intel E5200 (2-ядерный) 2.5 Ггц + 2 Гб ОЗУ;
  • Ноутбук: CPU AMD Athlon QL-62 (2-ядерный) 2 Ггц + 3 Гб ОЗУ.
ОС для теста:

MS Windows XP SP3 Eng x32 на ноутбуке и на компьютере (с одного диска устанавливались и один и тот же SP3 ставился).

Варианты компиляции:
  1. Отключена любая оптимизация;
  2. Включена вся возможная оптимизация.
Ограничения на тестирование:
  • Исходный код тестовой программы не изменяется в зависимости от компилятора;
  • Тестовая функция не использует функции системы, т.е. только вычислительные операции, все функции связанные с вызовом системных функций вызываются до и после замера времени;
  • Не используются библиотеки распараллеливания типа OpenMP;
  • Вычисления производятся только в одном потоке;
  • Компьютер не загружен больше никакими другими программами, только запущенная Windows + Notepad + тестовая программа;
  • Для тестов не использовалась VCL, MFC, CLR, ATL;
  • Код программ компилировался именно как С код, а не С++;
  • Для Tiny C Compiler использовался только 1 вариант компиляции, потому что он не поддерживает оптимизацию на уровне кода. Из документации: Оптимизация кода ограничена вычислением константных выражений на этапе компиляции, заменой операций умножения и деления операциями сдвига где это возможно, а также некоторыми другими действиями. Оптимизация переходов не производится, так как это потребовало бы организацию промежуточного кода в более абстрактном виде.
Метод тестирования:
  1. Выделение памяти для буферов;
  2. Получение UserTime текущего потока через GetThreadTimes;
  3. Выполнение тестовой функции;
  4. Получение UserTime текущего потока через GetThreadTimes;
  5. Получение разницы во времени с точностью до миллисекунд (1/1000 сек);
  6. Повторение последних 4-х действий 10 раз;
  7. Вычисление среднего арифметического значения времени.
Алгоритм вычислительной функции:
  1. Инициализация ключевой последовательности для алгоритма шифрования RC4;
  2. Инициализация ключевой последовательности для алгоритма шифрования AES-128;
  3. Заполнение первого тестового буфера данными полученными из генератора RC4;
  4. Вычисление CRC32 для первого тестового буфера;
  5. Шифрование первого тестового буфера алгоритмом AES-128, блоками по 128 бит, с помещением результата во второй тестовый буфер;
  6. Заполнение первого тестового буфера данными полученными из генератора RC4, т.е. первоначальные данные затираются полностью;
  7. Расшифровка второго тестового буфера с помещением результата в первый тестовый буфер;
  8. Подсчет CRC32 для расшифрованного первого тестового буфера;
  9. Сравнение CRC до шифрование и после.
Параметры теста:
  • Кол-во данных для шифрования — 1600 килобайт (102400 блоков);
  • Кол-во тестовых итераций для вычисления среднего арифметического значения времени — 10.
Результаты тестирования:
Intel C++ Compiler Pro 11.1.054
  • Ноутбук без оптимизации: 6301 мс;
  • Ноутбук с оптимизацией: 971 мс;
  • Компьютер без оптимизации: 4541 мс;
  • Компьютер с оптимизацией: 867 мс.
GCC 4.5.0 (MinGW)
  • Ноутбук без оптимизации: 6568 мс;
  • Ноутбук с оптимизацией: 1691 мс;
  • Компьютер без оптимизации: 4979 мс;
  • Компьютер с оптимизацией: 1521 мс.
MS C/C++ Compiler 15.00.21022.08 (VS 2008)
  • Ноутбук без оптимизации: 5149 мс;
  • Ноутбук с оптимизацией: 1574 мс;
  • Компьютер без оптимизации: 3740 мс;
  • Компьютер с оптимизацией: 1290 мс.
CodeGear C++ Builder 11.0 (C++Builder 2007)
  • Ноутбук без оптимизации: 4982 мс;
  • Ноутбук с оптимизацией: 3854 мс;
  • Компьютер без оптимизации: 4006 мс;
  • Компьютер с оптимизацией: 3185 мс.
Tiny C Compiler 0.9.25
  • Ноутбук: 6275 мс;
  • Компьютер: 4606 мс.
Более наглядно:График времени выполнения кода:imageГрафик скорости выполнения кода относительно лидера теста (лидер теста — 100%)image

Итоги:
По результатам тестирования на оптимизацию по скорости, компиляторы занимают следующие места:
  1. Intel C++ Compiler Pro 11.1.054;
  2. MS C/C++ Compiler 15.00.21022.08 (VS 2008);
  3. GCC 4.5.0 (MinGW);
  4. CodeGear C++ Builder 11.0 (C++Builder 2007);
  5. Tiny C Compiler 0.9.25.
Как видно, ребята из Intel хорошо постарались (на 32% код работал быстрее чем у ближайшего соперника) и их код имеет отличную оптимизацию не зависимо от того что он работает на Intel или AMD процессоре.

В тоже время С++ Builder показал себя не с лучшей стороны (отставание в 2 раза), что свидетельствует о чуть другой специфики его применения.

Ну а про Tiny C Compiler 0.9.25 и речи не может быть, потому что он вообще не поддерживает оптимизацию переходов, вот и выходит, что скорость выполнения программы находится на уровне с другими компиляторами без оптимизации при компиляции.

Конечно С++ Builder оказался чуть староват потому что не нашел я у себя более свежей версии. Хотя мне кажется, там мало что изменилось в этом плане.

Заключение
По результатам тестирования нельзя судить о компиляторе, что он хорош или плох, потому что каждому своё применение, а можно лишь говорить о том, какой их них подойдет для создания программных продуктов связанных с вычислительными операциями.

humour

Real Coder




Ретробоян, но всё ещё актуально.

Сам за собой замечал, что на алгебре пишу программу...