странная проблема производительности со Scala - PullRequest
1 голос
/ 18 ноября 2011

Я пробовал кое-что в 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 с.

1 Ответ

1 голос
/ 27 ноября 2011

Пожалуйста, замените приложение на приложение, и вы получите 100-кратное ускорение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...