Другие языки программирования и технологии
Как взаимосвязана скорость языка и мощность железа?
Я этим вопросом не задавался раньше, а сейчас понял что толком не могу на него ответить, даже поверхностно. Игры к примеру написанные на сишных языках работают быстро, но если пк слабый они тормозят. Значит мощность железа связана со скоростью? Бесконечен ли потенциал скорости, по идее нет... И с другой стороны, ведь языки отличаются по скорости, зависят ли они от мощности железа? Или может есть какой то порог, начиная с которого мощность железа уже не влияет на скорость языка? Но почему тогда существует данный барьер? Расскажите пожалуйста, очень интересно
Когда речь идёт о производительности расчётов, то оптимизируются следующие факторы (в порядке убывания важности):
1) Вообще принципиальная необходимость расчёта. Не рассчитывать всегда дешевле, чем рассчитывать. Это вопрос правильного проектирования приложения.
2) Асимптотика алгоритма. Алгоритм O(eⁿ) на C++ на больших данных всегда будет исполняться дольше, чем алгоритм O(n), реализованный на самом тупом интерпретаторе Бейсика 1970-х годов.
3) I/O и сетевые хопы. Сюда входят обеспечение локальности данных, кэширование, конвейеризация расчётов. Бывает, что этот фактор важнее, чем (2). Например, по планам исполнения тяжёлых запросов в Oracle нередко видно, что движок СУБД отступает от асимптотически более эффективного плана в пользу менее эффективного ради снижения количества I/O.
4) Динамические микрооптимизации: обеспечение более быстрого исполнения кода без изменения алгоритма. Есть статистика выполнения кода, и в зависимости от неё переупорядочивается исполнение, некоторые ветки вообще могут выкидываться, т.к. условие попадания в них всегда ложно. На уровне байткода интерпретируемых языков такие вещи делаются динамическим компилятором, например, JIT в JVM. На уровне CPU существует переупорядочивание исполнения инструкций, переименование регистров и др.
5) Статические микрооптимизации. Выполняются вручную человеком. Заметим, что разработчик уже давно и стабильно ошибается в предсказании узких мест программы, поэтому в серьёзных местах такие оптимизации выполняются только по итогам профилирования кода.
Выбор между компилируемым и интерпретируемым языками программирования относится к уровню 5, т. е. наименее важному. При этом, языки более высокого уровня облегчают декомпозицию логики от способов её исполнения и побочных эффектов, т.е. позволяют проще применять оптимизации на уровнях (1) - (3). Скажем, кэширование результатов трудоёмких вычислений в функциональных языках обеспечивается одной функцией-обёрткой общего вида, а в императивных - большими полотнищами кода, и не всегда оно вообще в них возможно.
Или вот, например, интересный кейс конца 1990-х годов, иллюстрирующий ситуацию соревнования медленного LISP и быстрого Ассемблера: http://www.paulgraham.com/carl.html
Крошечный стартап с бюджетом в несколько тысяч долларов "технологически унизил", как пишут, двух индустриальных гигантов с многомиллионной инфраструктурой, исключительно за счёт использования высшей математики при поиске оптимальных маршрутов перелёта (в США куча авиакомпаний, предлагающих разные условия, и пространство для перебора совсем простых случаев составляет, как пишет автор, около 250 млрд. вариантов).
Что касается местных "знатоков", с умным видом продающих тебе C++ как "быстрый" язык, то подавляющее большинство из них просто не допускается к алгоритмам и проектированию. Для них оптимизация сводится к работе кодогенератора: они вручную компилируют готовую спецификацию в кусок кода на языке программирования. Здесь по ответам многих деятелей видно, как они подходят к работе. Надо найти в диапазоне числа, кратные 1000, - будут перебирать весь диапазон и делить каждое число на 1000, в спецификации же так написано. Числа Фиббоначчи вычисляют рекурсивной фунцией, а потом жалуются на "медленный" язык. Единственный фактор производительности, на который они могут осознанно повлиять, - это в лучшем случае (5), а это означает выбор максимально низкоуровневого языка, который им позволяют выбрать (если кто-то в наше время вообще рискнёт доверить кодеру выбор языка).
1) Вообще принципиальная необходимость расчёта. Не рассчитывать всегда дешевле, чем рассчитывать. Это вопрос правильного проектирования приложения.
2) Асимптотика алгоритма. Алгоритм O(eⁿ) на C++ на больших данных всегда будет исполняться дольше, чем алгоритм O(n), реализованный на самом тупом интерпретаторе Бейсика 1970-х годов.
3) I/O и сетевые хопы. Сюда входят обеспечение локальности данных, кэширование, конвейеризация расчётов. Бывает, что этот фактор важнее, чем (2). Например, по планам исполнения тяжёлых запросов в Oracle нередко видно, что движок СУБД отступает от асимптотически более эффективного плана в пользу менее эффективного ради снижения количества I/O.
4) Динамические микрооптимизации: обеспечение более быстрого исполнения кода без изменения алгоритма. Есть статистика выполнения кода, и в зависимости от неё переупорядочивается исполнение, некоторые ветки вообще могут выкидываться, т.к. условие попадания в них всегда ложно. На уровне байткода интерпретируемых языков такие вещи делаются динамическим компилятором, например, JIT в JVM. На уровне CPU существует переупорядочивание исполнения инструкций, переименование регистров и др.
5) Статические микрооптимизации. Выполняются вручную человеком. Заметим, что разработчик уже давно и стабильно ошибается в предсказании узких мест программы, поэтому в серьёзных местах такие оптимизации выполняются только по итогам профилирования кода.
Выбор между компилируемым и интерпретируемым языками программирования относится к уровню 5, т. е. наименее важному. При этом, языки более высокого уровня облегчают декомпозицию логики от способов её исполнения и побочных эффектов, т.е. позволяют проще применять оптимизации на уровнях (1) - (3). Скажем, кэширование результатов трудоёмких вычислений в функциональных языках обеспечивается одной функцией-обёрткой общего вида, а в императивных - большими полотнищами кода, и не всегда оно вообще в них возможно.
Или вот, например, интересный кейс конца 1990-х годов, иллюстрирующий ситуацию соревнования медленного LISP и быстрого Ассемблера: http://www.paulgraham.com/carl.html
Крошечный стартап с бюджетом в несколько тысяч долларов "технологически унизил", как пишут, двух индустриальных гигантов с многомиллионной инфраструктурой, исключительно за счёт использования высшей математики при поиске оптимальных маршрутов перелёта (в США куча авиакомпаний, предлагающих разные условия, и пространство для перебора совсем простых случаев составляет, как пишет автор, около 250 млрд. вариантов).
Что касается местных "знатоков", с умным видом продающих тебе C++ как "быстрый" язык, то подавляющее большинство из них просто не допускается к алгоритмам и проектированию. Для них оптимизация сводится к работе кодогенератора: они вручную компилируют готовую спецификацию в кусок кода на языке программирования. Здесь по ответам многих деятелей видно, как они подходят к работе. Надо найти в диапазоне числа, кратные 1000, - будут перебирать весь диапазон и делить каждое число на 1000, в спецификации же так написано. Числа Фиббоначчи вычисляют рекурсивной фунцией, а потом жалуются на "медленный" язык. Единственный фактор производительности, на который они могут осознанно повлиять, - это в лучшем случае (5), а это означает выбор максимально низкоуровневого языка, который им позволяют выбрать (если кто-то в наше время вообще рискнёт доверить кодеру выбор языка).
Rustam Zakiev
Все внимательно прочитал но ответа на вопрос так и не нашел... Вопрос был более простым, если железо влияет на скорость низкоуровневых языков таких как C++, влияет ли оно на скорость высокоуровневых языков таких как Python? И еще меня заинтересовал отрывок про нахождение чисел кратных 1000. Можно подробно рассказать про другой подход, если этот считается не оптимальным? Просто мне в голову пришло только описанное вами решение с перебором чисел и делением каждого на 1000
пиши программы правильно, и железа хватит...
Rustam Zakiev
да не в этом дело, это теоретический вопрос...
Иван Герасимов
Будешь писать на Visual Basic или Python - не хватит.
ну на 5950X ядра на C++ компилятся быстрее чем на 10600K )
Языки программирования делятся на языки низкого и высокого уровня. Так вот те, что высокого уровня - включают много ненужных функций. В итоге программы написанные на этих языках - работают в тысячу раз медленнее. Например Visual Basic, Python и прочая шлабуда.
А нормальные программисты пишут на c++
Мощность железа - имеет значение всегда.
Другое дело, что разница в решении простых задач, на разных языках - незаметна для глаз пользователя. Только тогда, когда перед программой ставятся существенные задачи - это становится наглядным. Вы не сможете написать хорошую игру на языках высокого уровня.
А нормальные программисты пишут на c++
Мощность железа - имеет значение всегда.
Другое дело, что разница в решении простых задач, на разных языках - незаметна для глаз пользователя. Только тогда, когда перед программой ставятся существенные задачи - это становится наглядным. Вы не сможете написать хорошую игру на языках высокого уровня.
Rustam Zakiev
Это я знаю. Если все правильно понял выходит что на очень мощном ПК (если представить что он есть) python будет быстрее c++?
Гафуров Рафсан
Ставлю $1000, что если ты реализуешь на C++ математическую библиотеку высокой точности своими силами, без списывания с GMP или ещё откуда-то, то она будет медленнее питоновской.
Похожие вопросы
- Есть-ли алгоритмы скорость выполнения которых не зависит от мощности пк?
- Равны ли по мощности, гибкости языки C# и C++. Равны ли по мощности, гибкости языки C# и C++ или какой то из них мощнее?
- Скорость выполнения кода на разных языках программирования?
- Зависит ли скорость работы программы (скорость обработки данных) от языка программирования? или самой среды программирова
- Как продолжить изучение программирования и железа компьютера?
- Как определить мощность процессора на ноуте? Бюджет ноута до 60к.
- Помогите мне пожалуйста... Это касается "Железа" !!!
- Информация о системе и железе в C#
- Вопрос для знатоков комп. железа! Помогите понять - что здесь написано? Экран появляется всего на 1 секунду. Еле поймал.
- Меня забанили по железу, как обойти?