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

  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • LavcoPriceTech

    LavcoPriceTe

    21 AĞUSTOS 2010
  • Phymec

    Phymec

    18 Temmuz 2009