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

  • 3biblecom

    3biblecom

    23 NİSAN 2011
  • bobono1baby

    bobono1baby

    14 AĞUSTOS 2011
  • whiteboy7thst

    whiteboy7ths

    1 Temmuz 2009