Чтобы сравнить C ++ и Java в определенных задачах, я создал две похожие программы, одну на Java и одну на C ++. Когда я запускаю Java, он занимает 25% ЦП без колебаний, что вы ожидаете, поскольку я использую четырехъядерное ядро. Тем не менее, версия C ++ использует только около 8% и колеблется сильно. Я запускаю обе программы на одном компьютере, в одной и той же ОС, и в фоновом режиме работают одни и те же программы. Как заставить C ++ использовать одно полное ядро? Это две программы, которые ничем не прерываются. Они оба запрашивают некоторую информацию и затем вводят бесконечный цикл, пока вы не выйдете из программы, предоставляя обратную связь о том, сколько вычислений в секунду.
Код:
Чтобы ответить на несколько вопросов:
Я в основном зацикливаю кучу кода и вижу, как часто в секунду он зацикливается. Проблема в том, что он не использует весь процессор, который он может использовать. Все дело в том, чтобы один и тот же процессор выполнял одну и ту же задачу в Java и C ++ и сравнивал количество циклов в секунду. Но если один использует нерегулярное количество процессорного времени, а другой стабильно зацикливается с определенным процентом, их трудно сравнивать. Кстати, если я попрошу его выполнить это:
while(true){}
это занимает 25%, почему это не делает это с моим кодом?
—-редактировать:—-
После некоторых экспериментов кажется, что мой код начинает использовать менее 25%, если я использую оператор cout. Мне не ясно, почему cout заставил бы программу использовать меньше процессоров (я полагаю, что она останавливается до тех пор, пока не будет написано утверждение, которое явно занимает некоторое время?
Обладая этими знаниями, я перепрограммирую обе программы (чтобы они были сопоставимы) и просто позволил ему сообщать о результатах через 60 секунд, а не каждый раз, когда он завершал цикл.
Спасибо за помощь, некоторые советы были действительно полезны. После того, как я обнаружил ответ, кто-то также, как оказалось, дал это как ответ, так что даже если бы я сам не нашел его, я бы получил ответ. Спасибо!
(хотя я хотел бы знать, почему std :: cout занимает такое количество времени)
Ваш основной цикл имеет cout
в нем, который будет вызывать к ОС, чтобы записать накопленный вывод в какой-то момент. Либо время ОС не учитывается в вашем приложении, либо оно вызывает некоторый дисковый ввод-вывод или другую активность, которая заставляет вашу программу ждать.
Вероятно, неточно сравнивать оба этих процесса одновременно, не учитывая тот факт, что они будут конкурировать за процессорное время. ОС автоматически выберет планирование для этих двух задач, на которые может повлиять то, какая из них была запущена первой, и множество других критериев.
Выполнение их обоих одновременно потребует некоторого типа конфигурации планирования, так что каждый из них будет ограничен для запуска одним (или двумя) процессорами, и каждое приложение использует разные процессоры. Это можно сделать, выполнив каждую основную функцию для выполнения отдельного потока, который выполняет всю работу, а затем установив процессор, на котором будет выполняться этот поток. В C ++ 11 это можно сделать с помощью станд :: нить а затем установить базовую привязку процессора, получив native_handle и установить его там.
Я не уверен, как это сделать на Java, но я уверен, что процесс похож.