я столкнулся с этой проблемой при выполнении домашних заданий от Coursera «лестница специализации» (это упрощенная версию и не содержит какие-либо деталей домашнего задания, это просто обход массива)Scala сопоставления с образцом производительность
val chars: Array[Char] = some array
def fun1(idx:Int):Int = {
some code here (including the stop condition)
val c = chars(idx)
c match{
case '(' => fun1(idx+1)
case _ => fun1(idx+1)
}
}
Этого код 4 раз медленнее, чем
def fun2(idx: Int):Int = {
some code here (including the stop condition)
val c = chars(idx)
(c == '(') match{
case true => fun2(idx+1)
case _ => fun2(idx+1)
}
}
Все, что я делаю меняется по шаблону (Я бегу это с помощью ScalMeter поэтому я считаю, в статистике).
Может ли кто-нибудь объяснить это поведение?
Я бы сомневался, что это что-то около действующего метода бенчмаркинга. ScalaMeter любит пару десятков разминок до тех пор, пока результаты не стабилизируются. Вы даже не проверяете использование одних и тех же данных. –
Да, не те же данные. Но я получаю довольно близкие результаты между прогонами. Stddev крайне низок, что предполагает, что если бы я использовал одни и те же данные, я бы не видел большой разницы. Как уже упоминалось в ответе, я сделал разминки, поэтому не уверен, что с этим эталоном вы найдете «недействительным». Я согласен с моими выводами и призываю вас опровергнуть их окончательно (и воспроизводимо), если сможете. – Dima
Заимствование ваших функций, вот эталонный показатель с scala-счетчиком: https://gist.github.com/lukaszwawrzyk/a2505d5b3083bb72de51b8445fbb9a76 Предоставление 'char time: 13.172258374999998 ms' и' bool time: 4.739404575 ms'. Это делается для массивов, как в вопросе, если использование индексированных результатов seq действительно ближе, но не равно (95 секунд против 80 секунд) –