Я пробовал кое-что в scala и обнаружил странную проблему с производительностью, показанную приведенным ниже кодом. Здесь встраивание вызова функции делает вычисление в 4 раза дольше (4 с против 16 с).
package mypackage
object MyObject extends Application {
class Complex(val real: Double, val imaginary: Double) {
def +(operand: Complex): Complex = {
new Complex(real + operand.real, imaginary + operand.imaginary)
}
def *(operand: Complex): Complex = {
new Complex(real * operand.real - imaginary * operand.imaginary,
real * operand.imaginary + imaginary * operand.real)
}
def mag2 = real * real + imaginary * imaginary
}
val iSize = 1250
val jSize = 1250
val xMin = -2.5
val xMax = +1.5
val yMin = -2.0
val yMax = +2.0
val dx = (xMax - xMin) / iSize
val dy = (yMax - yMin) / jSize
val steps = 50
def iterate(c: Complex) = {
var z = c
var n = 0
do {
z = z * z + c
n += 1
} while (n < steps && z.mag2 < 4.0)
}
// Mandelbrot set using iteration in a function.
var startTime = System.currentTimeMillis()
for (i <- 0 until iSize; j <- 0 until jSize) {
val c = new Complex(xMin + i * dx, yMin + j * dy)
iterate(c)
}
System.out.println("Elapsed time: " + (System.currentTimeMillis() - startTime) / 1000.0 + " (s)")
// Mandelbrot set using iteration.
startTime = System.currentTimeMillis()
for (i <- 0 until iSize; j <- 0 until jSize) {
val c = new Complex(xMin + i * dx, yMin + j * dy)
var z = c
var n = 0
do {
z = z * z + c
n += 1
} while (n < steps && z.mag2 < 4.0)
}
System.out.println("Elapsed time: " + (System.currentTimeMillis() - startTime) / 1000.0 + " (s)")
}
Есть идеи, почему это произойдет? Интересно, что добавление «@inline» перед функцией «iterate» приводит к тому, что это занимает 12 с против 4 с.