SORU
7 HAZİRAN 2011, Salı


Neden bu Scala kod için küçük bir değişiklik, performans için böyle büyük bir fark yaratır mı?

32-bit Debian 6.0 (Sıkmak) bir sistem (2.5 GHz Core 2 CPU),-java6 6.24-1 sun ama Wheezy gelen Scala 2.8.1 paketleri ile koşuyorum.

Bu kod, scalac -optimise, derlenmiş 30 saniye çalıştırmak için gereken:

object Performance {

  import scala.annotation.tailrec

  @tailrec def gcd(x:Int,y:Int):Int = {
    if (x == 0)
      y 
    else 
      gcd(y%x,x)
  }

  val p = 1009
  val q = 3643
  val t = (p-1)*(q-1)

  val es = (2 until t).filter(gcd(_,t) == 1)
  def main(args:Array[String]) {
    println(es.length)
  }
}

Ama yaparsam önemsiz değişim hareketli val es= Bir satır aşağı ve içeri kapsam main, çalıştıktan sonra sadece 1 saniye ya da daha fazla gibi beklediğim görmek ve karşılaştırılabilir performans ile eşdeğer C . İlginçtir, nerede val es= terk ama lazy ile yeterlik de aynı hızlandırıcı etkiye sahiptir.

Burada neler oluyor? Neden işlevi dışında hesaplama gerçekleştirmek kapsamı bu kadar yavaş?

CEVAP
7 HAZİRAN 2011, Salı


JVM yöntem çağrıları en iyi aynı seviyeye statik başlatıcılar bunun ne olduğu) optimize değil. Bir sürü iş var yaptığınızda, ne yazık ki, bu performans--acıyor bu mükemmel bir örnektir. Bunun da tek sebebi eski Application sürekli olarak sorunlu ve neden orada olduğunu Scala 2.9 DelayedInit özellik bu alır biraz yardım derleyici için hareket şeylerden başlatıcı bir yöntem deniyor sonra.


(Edit:"""". başlatıcı yapıcı sabit Oldukça uzun bir yazım hatası!)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GALERNAYA20

    GALERNAYA20

    19 NİSAN 2011
  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007
  • tutvid

    tutvid

    19 AĞUSTOS 2006