Java derleme hızı ve Scala derleme hızı


101

Bir süredir Scala'da programlama yapıyorum ve hoşuma gidiyor ama beni rahatsız eden tek şey, programları derlemek için geçen süre. Küçük bir şey gibi görünüyor ama Java ile programımda küçük değişiklikler yapabilirim, netbeans'teki çalıştır düğmesini tıklayabilirim ve BOOM çalışıyor ve zamanla scala'da derlemek çok zaman alıyor gibi görünüyor. Pek çok büyük projede, derlemenin aldığı zaman nedeniyle bir betik dilinin çok önemli hale geldiğini duydum, Java kullanırken ortaya çıktığını görmediğim bir ihtiyaç.

Ama anladığım kadarıyla, diğer derlenmiş dillerden daha hızlı ve Scala'ya geçme nedenimden dolayı hızlı olan Java'dan geliyorum (Çok basit bir dil).

Bu yüzden sormak istedim, Scala'nın daha hızlı derlenmesini sağlayabilir miyim ve scalac her zaman javac kadar hızlı olacak.


Görünüşe göre bazı kullanıcılar sizinle aynı fikirde;) twitter.com/etorreborre/status/21286172202
VonC

Go, Java'dan daha hızlı derler. Daha hızlı, bu da bir şey söylüyor.
Daniel C. Sobral

Ahaha, benim durumumda, birkaç tazı LOC ile ortalama scalac derlemesi birkaç dakika sürüyor, fsc biraz daha hızlı.
Jeriho

Yanıtlar:


57

Scala derleyicisi, Java'lardan daha karmaşıktır, tür çıkarımı, örtük dönüştürme ve çok daha güçlü bir tür sistemi sağlar. Bu özellikler ücretsiz gelmiyor, bu yüzden scalac'ın javac kadar hızlı olmasını beklemem. Bu, işi yapan programcı ile işi yapan derleyici arasındaki bir değiş tokuşu yansıtır.

Bununla birlikte, derleme süreleri Scala 2.7'den Scala 2.8'e geçerken gözle görülür şekilde iyileşti ve toz 2.8'e yerleştiğinden, iyileştirmelerin artık devam etmesini bekliyorum. Bu sayfa , Scala derleyicisinin performansını artırmak için devam eden bazı çabaları ve fikirleri belgeler.

Martin Odersky cevabında çok daha fazla ayrıntı veriyor.



Net fasulyeden karınca + jedit'e geçtim (biliyorum, karınca mağara adamları içindir, ancak kendi zamanıma göre gelişeceğim) böylece fsc kullanabileyim. Ama merak ediyordum, Clojure'un derleme hızı Scala ile karşılaştırıldığında nasıl? Scala'daki birçok özelliğe sahip gibi görünüyor, ancak sözdiziminin ayrıştırılmasının çok daha kolay olduğunu düşünüyorum.
user405163

1
Burada konu dışı kalıyoruz, ancak Clojure'un derleyicisi inanılmaz derecede hızlı (eşdeğer kaynaklarda javac'tan çok daha hızlı). Haklısın, bunun gerçekten basit bir dil olmasına rağmen, herhangi bir statik tip sistemi yok, bu da biraz yardımcı oluyor.
Daniel Spiewak

458

Scala derleyicisinin hızının (eksikliğinin) iki yönü vardır.

  1. Daha fazla başlangıç ​​ek yükü

    • Scalac'ın kendisi, yüklenmesi ve jit ile derlenmesi gereken çok sayıda sınıftan oluşur

    • Scalac, tüm kök paketler ve dosyalar için sınıf yolunu aramalıdır. Sınıf yolunuzun boyutuna bağlı olarak bu, fazladan bir ila üç saniye sürebilir.

    Genel olarak, ilk seferde çalıştırırsanız, disk önbellekleri doldurulmaması için daha uzun olan, 4-8 saniyelik bir başlangıç ​​ek yükü bekleyin.

    Scala'nın başlangıç ​​ek yüküne cevabı ya fsc kullanmak ya da sbt ile sürekli bina yapmaktır. IntelliJ'in bu iki seçenekten birini kullanacak şekilde yapılandırılması gerekir, aksi takdirde küçük dosyalar için bile ek yükü makul derecede büyüktür.

  2. Daha yavaş derleme hızı. Scalac, yaklaşık 500 ila 1000 satır / saniye yönetir. Javac bunun yaklaşık 10 katını yönetiyor. Bunun birkaç nedeni var.

    • Tür çıkarımı, özellikle örtük arama içeriyorsa maliyetlidir.

    • Scalac'ın iki kez tür denetimi yapması gerekir; Scala kurallarına göre bir kez ve Java kurallarına göre silme işleminden sonra ikinci kez.

    • Tip kontrolünün yanı sıra, Scala'dan Java'ya gitmek için yaklaşık 15 dönüşüm adımı vardır ve bunların hepsi zaman alır.

    • Scala tipik olarak, özellikle işlevsel deyimler yoğun bir şekilde kullanılıyorsa, her dosya boyutu için Java'dan çok daha fazla sınıf üretir. Bayt kodu oluşturma ve sınıf yazma zaman alır.

    Öte yandan, 1000 satırlık bir Scala programı 2-3K satırlık bir Java programına karşılık gelebilir, bu nedenle saniyede satır olarak sayıldığında daha yavaş olan hızın bir kısmı, satır başına daha fazla işlevselliğe karşı dengelenmelidir.

    Hız iyileştirmeleri üzerinde çalışıyoruz (örneğin, paralel olarak sınıf dosyaları oluşturarak), ancak bu cephede mucizeler beklenemez. Scalac asla javac kadar hızlı olmayacak. Çözümün iyi bir bağımlılık analizi ile birlikte fsc gibi derleme sunucularında yatacağına inanıyorum, böylece yalnızca minimum dosya kümesinin yeniden derlenmesi gerekecek. Bunun üzerinde de çalışıyoruz.


1
Sınıf yüklemesinden kaynaklanan başlangıç ​​ek yükü hakkında: GCJ veya Mono yardımı kullanarak yerel koda önceden derleme yapmak mı?
Mekanik salyangoz

15
Ya Scala C ++ ile yeniden yazıldıysa? : o)
marcus

Çağrılan dinamik bayt kodu talimatını kullanmanın bir faydası olur mu?
Rob Grant

40

Scala derlemesinin, derlemenin Java'dan en az bir kat daha uzun sürdüğünün farkında olmalısınız. Bunun nedenleri aşağıdaki gibidir:

  1. Adlandırma kuralları (bir dosya XY.scaladosyasının çağrılan bir sınıf içermesi gerekmez XYve birden çok üst düzey sınıf içerebilir). Bu nedenle derleyicinin, belirli bir sınıf / özellik / nesne tanımlayıcısını bulmak için daha fazla kaynak dosyayı araştırması gerekebilir.
  2. Çıkarımlar - dolaylı etkilerin yoğun kullanımı, derleyicinin belirli bir yöntem için kapsam içi örtük dönüşümü araştırması ve "doğru" olanı bulmak için onları sıralaması gerektiği anlamına gelir. ( yani derleyici, bir yöntemi bulurken büyük ölçüde artırılmış bir arama etki alanına sahiptir. )
  3. Tip sistemi - scala tipi sistem Java'nınkinden çok daha karmaşıktır ve bu nedenle daha fazla CPU zamanı alır.
  4. Tür çıkarımı - tür çıkarımı hesaplama açısından pahalıdır ve javachiç yapılması gerekmeyen bir iştir
  5. scalacGenICode derleme aşamasında CTRL-ALT-F12 sihirli tuş kombinasyonu kullanılarak görüntülenebilen, tamamen silahlanmış ve operasyonel bir savaş istasyonunun 8 bitlik bir simülatörünü içerir .

3
@obox_lakes, nitpick istemezdim ama Java yapar parametreli yöntemler için tip çıkarsama yapmak ihtiyacını int a<T>(T a) {}sonra ve a(pls_infer_my_type). james-iry.blogspot.com/2009/04/…
Elazar Leibovich

13
@Elazar - evet, biliyorum. Ama açıkçası, skala'nın yanında, buna "tip çıkarımı" demek gülünçtür!
oxbow_lakes


19

Scala yapmanın en iyi yolu IDEA ve SBT'dir. Temel bir SBT projesi oluşturun (isterseniz sizin için yapacaktır) ve otomatik derleme modunda (komut ~compile) çalıştırın ve projenizi kaydettiğinizde SBT onu yeniden derleyecektir .

Ayrıca IDEA için SBT eklentisini kullanabilir ve Çalıştırma Yapılandırmalarınızın her birine bir SBT eylemi ekleyebilirsiniz. SBT eklentisi ayrıca size IDEA içerisinde etkileşimli bir SBT konsolu sağlar.

Her iki durumda da (SBT harici olarak çalışır veya SBT eklentisi), SBT çalışır durumda kalır ve böylece projenizi oluştururken kullanılan tüm sınıflar "ısınır" ve JIT-edlenir ve başlatma ek yükü ortadan kalkar. Ayrıca, SBT yalnızca ona ihtiyaç duyan kaynak dosyaları derler. Scala programları oluşturmanın açık ara en verimli yoludur.


9

Scala-IDE'nin (Eclipse) en son revizyonları, artımlı derlemeyi yönetmede çok daha iyidir.

Daha fazla bilgi için " En iyi Scala oluşturma sistemi nedir? " Konusuna bakın .


Diğer çözüm, fsc'yi - Scala 2 dili için hızlı çevrimdışı derleyici - (bu blog yazısında gösterildiği gibi) IDE'nize bir oluşturucu olarak entegre etmektir.

alternatif metin

Ancak Daniel Spiewak'ın yorumlarda belirttiği gibi, doğrudan Eclipse'de değil :

Eclipse zaten yüzeyin altında FSC kullanıyorsa, doğrudan Eclipse içinde FSC kullanmamalısınız.
FSC, temelde yerleşik derleyicinin üstündeki ince bir katmandır ve tam olarak Eclipse tarafından Scala projelerini derlemek için kullanılan mekanizmadır.


Son olarak, Jackson Davis'in yorumlarda bana hatırlattığı gibi :

sbt (Basit Derleme Aracı) , mükemmel olmasa da bir tür "artımlı" derleme ( tetiklenen yürütme yoluyla ) içerir ve geliştirilmiş artımlı derleme, gelecek 0.9 sbt sürümü için çalışmaktadır.


2
sbt artımlı derlemeler de yapabilir
Jackson Davis

@Jackson: tetiklenen yürütme, doğru! Cevabıma ekledim.
VonC

2
Eclipse zaten yüzeyin altında FSC kullanıyorsa , doğrudan Eclipse içinde FSC kullanmamalısınız. FSC, temelde yerleşik derleyicinin üstündeki ince bir katmandır ve bu, tam olarak Eclipse tarafından Scala projelerini derlemek için kullanılan mekanizmadır.
Daniel Spiewak

1
Değil Fast Java derleyicisi - FSC Hızlı Scala Compiler açılımı
Ben Mccann

@BenMcCann: oops. Sağ. Cevabı düzelttim.
VonC

6

Fsc kullanın - arka planda çalışan ve her zaman yüklenmeye ihtiyaç duymayan hızlı bir scala derleyicisidir. Önceki derleyici örneğini yeniden kullanabilir.

Netbeans scala eklentisinin fsc'yi destekleyip desteklemediğinden emin değilim (dokümantasyon öyle söylüyor), ancak çalışmasını sağlayamadım. Eklentinin gecelik derlemelerini deneyin.


1
IntelliJ IDEA Scala eklentisinin ayrıca fsc kullanma seçeneği de var
Aaron Novstrup

1
@anovstrup: evet, ancak bazen çöküyor.
Denis Tulskiy

4

Scala için ücretsiz olan JRebel eklentisini kullanabilirsiniz. Böylece "hata ayıklayıcıda geliştirme" yapabilirsiniz ve JRebel her zaman değiştirilen sınıfı anında yeniden yükler.

Martin Odersky'nin kendisinin bir yerde, sonuç aramalarının (derleyicinin belirsizlikleri ortadan kaldırmak için aynı dönüşüm için birden fazla örtük olmadığından emin olması gerekir) derleyiciyi meşgul edebileceğini söylediği bazı ifadeleri okudum. Bu nedenle, imaları dikkatle ele almak iyi bir fikir olabilir.

% 100 Scala olması gerekmiyorsa, ama aynı zamanda benzer bir şey varsa, Kotlin'i deneyebilirsiniz.

- Oliver


2

Eminim bu olumsuz oylama yapılacaktır, ancak son derece hızlı geri dönüş her zaman kalite veya üretkenlik açısından elverişli değildir.

Daha dikkatli düşünmek ve daha az geliştirme mikro döngüsü gerçekleştirmek için zaman ayırın. İyi Scala kodu daha yoğun ve daha önemlidir (yani, arızi ayrıntılar ve karmaşıklık içermez). Daha fazla düşünmeyi gerektirir ve bu zaman alır (en azından ilk başta). Bireysel olarak biraz daha uzun olan ve yine de üretkenliğinizi ve işinizin kalitesini artıran daha az kod / test / hata ayıklama döngüsü ile iyi bir şekilde ilerleyebilirsiniz.

Kısaca: Scala'ya daha uygun bir optimum çalışma modeli arayın.


3
Hızlı bir dönüş döngüsüne sahip olmanın gerekli olmadığına katılıyorum. Ama acıtmıyor, değil mi?
Elazar Leibovich

27
Olumsuz oy vermeyeceğim, ancak aracı geliştirmeye çalışmak yerine çalışma şeklinizi aracınızın sınırlamalarına (derleyicinin yavaş hızı) göre ayarlamanız gerektiğini söylemek iyi bir argüman değildir. Özellikle hızlı test döngüleri yapabilme yeteneği çok değerlidir (derin düşünme ihtiyacının yerini almasa da, muhtemelen klavyeden uzakta en iyi şekilde yapılan türden, onu güzel bir şekilde tamamlar).
Thilo

9
Sanırım üretkenliğimin çoğu, koşmadan önce aşırı düşünme nedeniyle kayboldu. Kendimi sık sık uzun süreler boyunca bazı denklemlere bakarken buluyorum, beni bekleyen olası bir tuzağın ne olduğunu anlamaya çalışırken, "Sadece çalıştırın!" kafamın arkasında. Ve tabii ki, programı çalıştırdığımda, muhtemelen bir veya iki saat daha meditasyonla elde edebileceğimden çok daha fazlasını öğreniyorum. Meditasyon iyidir, ancak java ile en uygun artımlı derleme / meditasyon kullanımına sahip olduğumu hissediyorum.
user405163

2
Bu aynı zamanda Shakespeare'in bir yazım denetleyicisi kullanmaması ve bunun yerine ne söylemek istediği hakkında daha çok düşünmesi gerektiğini önermeye benzer. Otomatik yazım denetleyici, tamamen farklı bir dizi soruna yardımcı olur.
Thilo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.