2013-12-06 1 views
2

Чтобы сравнить C++ и Java по определенным задачам, я создал две аналогичные программы: одну на Java и одну на C++. Когда я запускаю Java, он занимает 25% процессор без колебаний, чего вы ожидаете, когда я использую четырехъядерный ядро. Тем не менее, версия C++ использует только около 8% и сильно колеблется. Я запускаю обе программы на том же компьютере, в той же ОС, с теми же программами, которые активны в фоновом режиме. Как заставить C++ использовать одно полное ядро? Это две программы, которые не прерываются ничем. Они оба запрашивают некоторую информацию, а затем вводят бесконечный цикл до выхода из программы, давая обратную связь о том, сколько вычислений в секунду.Выполнение C++ на полной скорости

Код:

http://pastebin.com/5rNuR9wA

http://pastebin.com/gzSwgBC1

http://pastebin.com/60wpcqtn

Чтобы ответить на некоторые вопросы:

Я в основном зацикливание кучу кода и, видя, как часто в секунду это петли. Проблема в том, что он не использует весь процессор, который он может использовать. Все дело в том, чтобы один и тот же процессор выполнял одну и ту же задачу в Java и C++ и сравнивал количество циклов в секунду. Но если вы используете нерегулярные объемы процессорного времени, а другие - стабилизируются циклически с определенным процентом, их трудно сравнивать. Кстати, если я попрошу его выполнить это:

while(true){} 

Требуется 25%, почему он не делает это с моим кодом?

---- редактировать: ----

После нескольких экспериментов, кажется, что мой код начинает использовать менее чем на 25%, если я использую COUT заявление. Мне непонятно, почему cout приведет к тому, что программа будет использовать меньше процессоров (я предполагаю, что она приостанавливается до тех пор, пока не будет написано заявление, которое занимает некоторое время?

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

Спасибо за помощь, некоторые из советов были действительно полезны. После того, как я обнаружил ответ, кто-то также оказал это как ответ, поэтому, даже если бы я не нашел его сам, я бы получил ответ. Спасибо!

(хотя я хотел бы знать, почему std :: cout занимает такое количество времени)

+0

Зависит полностью от того, что он делает. Возможно, это время ждет ... чего-то. Память, диск, i/o, я не знаю. – BoBTFish

+0

Без просмотра код, невозможно. Ваша программа на C++ менее эффективна или скомпилирована без оптимизации или чего-то еще. – Joe

+0

Я мог бы опубликовать код, если вы считаете это полезным, но не менее эффективный означает, что он просто делает меньше с использованием процессора? – Wysaard

ответ

2

В вашей основной петле есть cout, в которой вызывается ОС для записи накопленного выхода в какой-то момент. Любое время ОС не учитывается в отношении вашего приложения, или это приводит к тому, что некоторые дисковые операции ввода-вывода или другие действия заставляют вашу программу ждать.

0

Возможно, неточно сравнить оба этих режима одновременно, не учитывая тот факт, что они будут соревноваться за время процессора. ОС автоматически выберет планирование для этих двух задач, на которые может повлиять первый запуск, и множество других критериев.

Для их одновременного запуска потребуется определенная конфигурация планирования, чтобы каждый из них ограничивался одним (или двумя) процессорами, и каждое приложение использует разные cpus. Это можно сделать, если каждая основная функция выполняет отдельный поток, который выполняет всю работу, а затем устанавливает процессор, в котором будет выполняться этот поток. В C++ 11 это можно сделать с помощью std::thread, а затем установить базовое сродство к процессору, получив native_handle и установив его там.

Я не уверен, как это сделать на Java, но я уверен, что процесс похож.

+0

Я не запускаю их одновременно. Я запускаю один, затем другой – Wysaard

+0

Похоже, я неправильно понял ваше сообщение. Не обращай на меня внимания. :) –