Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (3)

Наибольший вклад в теги

Все теги (21)

Лучшие ответы пользователя

Все ответы (21)
  • Есть ли основные правила супер оптимизации?

    ErmIg
    @ErmIg
    Программист
    Есть развернутый ответ для С++ кода, но его можно обобщить и на другие языки и платформы:

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

    1) Важно понимать, что алгоритмическая оптимизация практически всегда может дать лучший эффект, чем программная. Так, если алгоритм имеет сложность O(n^2), то на больших исходных данных он при любой оптимизации будет медленнее, чем неоптимизированный алгоритм сложности O(n). Впрочем, при выборе алгоритма, опираться только на его сложность не стоит: если объем исходных данных не велик, то вполне может оказаться, что алгоритм со сложностью O(n^2) будет работать быстрее, чем с O(n).
    2) Очень важно повторное использование (кеширование) промежуточных данных, вычисленных в программе – ибо быстрее всего выполняется работа, которую не надо делать. Тем не менее, не надо чрезмерно кешированием увлекаться – если объем кэшируемых данных слишком велик, то это может отрицательно сказаться на общей производительности программы (некоторые данные быстрее вычислять на лету, чем считывать из памяти).
    3) Следует избегать излишнего копирования данных (например, передавать сложные типы данных по ссылке, а не по значению).
    4) По возможности следует избегать условных операторов во вложенных циклах. Так как условные переходы, вызываемые такими операторами, плохо обрабатываются современными процессорами с конвейерной архитектурой.
    5) Данные в памяти, которые используются алгоритмами, должны по возможности лежать упорядочено, и использоваться последовательно. Это позволит процессору их эффективно кешировать. Важно помнить, что доступ к кэшу процессора значительнее быстрее, чем к оперативной памяти.
    6) Если алгоритмы это позволяют, то возможно стоит реализовать их параллельное исполнение (в отдельных потоках или процессах). Это позволит эффективно задействовать современные многоядерные процессы.
    7) В некоторых случаях (например обработка изображений) большого эффекта можно достичь применением специализированных расширений процессора (SSE, SSE2, AXX, AVX2 и другие). Стоит отметить, что большинство современных компиляторов (GCC, MSVS, ICC) поддерживают непосредственное использование данных расширений непосредственно из С++ кода при помощи специальных встроенных функций (intrinsics). Минусами такого подхода является потеря переносимости (впрочем, эта проблема решается наличием разных веток программы под разные процессоры) и значительное усложнение программы.
    8) Также большого эффекта можно достичь применением специализированных ускорителей, например GPU (технологии CUDA, OpenCL). Минусами таких решений являются потеря универсальности и значительное усложнение программы, а также то, что на специализированных ускорителях, как правило, хорошо работает далеко не каждый алгоритм.
    Ответ написан
    Комментировать
  • Глобальные переменные или частое пересоздание локальных?

    ErmIg
    @ErmIg
    Программист
    Если используются 4 временных переменных типа double - это 32 байта. При частом их использовании они будут лежать в кеше процессора, если даже не в его регистрах. Если вы их сделаете глобальными никакого выигрыша не будет, если только там нет какого-нибудь сложного алгоритма их инициализации. Но при наличии глобальных переменных есть очевидный минус - при много поточном использовании вашей функции могут возникнуть большие проблемы.
    Ответ написан
    Комментировать
  • Как правильно сравнить массивы и оценить их схожесть?

    ErmIg
    @ErmIg
    Программист
    По сути, кольца чисел - это периодические фунции. Лучше сравнивать не сами значения, их фурье спектры. Если отбросить фазу комплексного фурье спектра, то спектры таких колец будут схожими, даже если их отсчитывать с разных позиций.
    Ответ написан
    Комментировать
  • Где 128-битные процессоры?

    ErmIg
    @ErmIg
    Программист
    Тут важно, что вы понимаете под 128-bit процессорами?
    1) Если способность работать с 128-bit указателями, то наверное это в обозримом будущем не потребуется, так как пока вполне хватает 64-bit указателей, которые могут адресовать порядка 10^19 байт.
    2) Если способность работать с вещественными числами разрядностью в 128-bit, то такой процессор был в 70-е IBM_System/370, но затем от аппаратной поддержки таких чисел отказались за ненадобностью.
    3) Если способность работать с целыми числами разрядностью в 128-bit, то такой процессор тоже был в 80-е VAX (правда для работы с 128 разрядными числами там использовалось 4 32-bit регистра), но затем от аппаратной поддержки таких чисел тоже отказались.
    4) Если просто наличие 128-bit регистров, то такие процессоры давно есть (уже есть и 256-bit, а в ближайшее время ожидается и 512-bit), правда хранятся в них не одиночные числа, а вектора вещественных или целых числе меньшей разрядности.
    Ответ написан
    Комментировать