2010-04-10 2 views
2

Я использую сторонний API, который выполняет то, что я предполагаю, это дорогостоящие операции с точки зрения используемого времени/ресурсов (распознавание изображений и т. Д.). Какие контрольные признаки существуют, чтобы тестировать код для использования потоков для повышения производительности?Каковы контрольные признаки того, что мой код должен использовать многопоточность?

У меня есть профилировщик и будет профилировать код, который я пишу, который будет полагаться на этот API.

Благодаря

ответ

1

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

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

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

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

1

Обработка изображений часто связана cpu. Однако, если ваша обработка изображений api уже предназначена для использования нескольких процессоров, многопоточность, вероятно, вам не поможет. Стратегия, которую я обычно рассматриваю для быстрого определения того, поможет ли многопоточность, - это написать простую программу, которая обрабатывает соответствующую обработку снова и снова. Затем я запустил его на наборе данных, затем запустил два экземпляра процесса одновременно, каждый по половине данных. Нет необходимости обеспечивать, чтобы данные были сравнены для такого теста; если один из процессов закончится, он просто запустит один экземпляр для чего-либо оставленного. Сроки выполняются через настенные часы. Я имею в виду это буквально; выберите достаточно большой набор данных, для выполнения которого потребуется не менее минуты, но в идеале - 5 минут или более).

Если одновременная работа двух копий значительно улучшает пропускную способность, многопоточность, вероятно, хорошая идея. Очевидно, что эта стратегия практична только в определенных случаях, и в некоторых случаях многопоточность может включать использование совместного вывода таким образом, чтобы этот трюк не мог эмулировать. Но, это абсурдно легкий тест для запуска, и редко требуется много, если есть, код, который нужно написать.

Смежные вопросы