2016-11-22 6 views
0

Я побежал NYTProf в программе perl, я очень удивлен, увидев, что линия с «распаковкой» занимает много времени: (линия была выполнена 14654 раза и заняла 39,6 мс). Но сама функция unpack() довольно быстроslow perl performance, почему и как улучшить

$delme1 = substr($data, 47,1) 
    $_flags = unpack("C", $delme1); 
    # spent 2.98ms making 14654 calls to main::CORE:unpack, avg 203ns/call 

Любой знает, почему такие большие накладные расходы?

Благодаря

Update 1 См строку с "распаковывать" вызова. В нем говорится, что он потратил в общей сложности 39,6 мс.

enter image description here

+0

Я не знаю, что означают цифры слева, но он прямо сказал вам, что сумма была 2,98 мс, и что каждый проход занял 2,98 мс/14654 звонка = 203 нс/звонок – ikegami

+0

Столбец для 39,6 мс название «Время на линии» согласно NYTProf. Столбец для 2,98 мсек - «тайм-тайм». Когда я смотрю на общее время, проведенное в рутине, которая имеет несколько строк, 39,6 мс сильно взвешивается в течение всего времени. Так или иначе, процессор потратил много времени на эту линию. – packetie

+0

Coroberation: perl -MBenchmark = timethis -e'timethis (-3, q {для (1..1000) {my $ x = unpack ("C", "X");}}); '' output ' 3283.39/s', что равно 1 распаковке + присваивание + цикл каждые 304ns. – ikegami

ответ

2

линия получила казнены 14654 раз и взял 39.6ms

Нет, линия получила казнены 14654 раз и взял 2.98ms. Каждое исполнение занимало 203ns в среднем. Не совсем медленно ...


Вы можете попробовать использовать

$_flags = ord(substr($data, 47, 1)); 

или

$_flags = unpack('x47 C', $data); 

Есть, конечно, лучше обстоят дела с целью оптимизации. Например, вам будет полезно иметь одну распаковку, а не использовать несколько вызовов для substr и распаковки.

+0

Вы правы, я сломал его, чтобы посмотреть, что занимает время. Появляется вызов unpack(). Учитывая, что сама функция unpack() очень эффективна, я думаю, что накладные расходы на вызов вызова очень дороги. Интересно, есть ли способ ускорить его. – packetie

+0

Нет накладных расходов на вызов 'unpack'. Вообще. Потому что нет реального вызова, потому что это не подпрограмма; это оператор, как '+'. – ikegami