SORU
14 Ocak 2015, ÇARŞAMBA


Nasıl XEx Delphi kod üretimi etkileyecek KOL hedefler/Android için?

Bu Embarcadero Delphi derleyicileri Android cihazlar için native ARM code üretmek için LLVM bir arka uç kullanın. Android uygulamaları derlemek için lazım Pascal kod büyük miktarda var, ve Delphi daha verimli kod üretmek için nasıl bilmek istiyorum. Şu anda bile otomatik SIMD iyileştirmeleri gibi gelişmiş özellikler hakkında, sadece makul kod üreten konuşmuyorum. Kesinlikle LLVM yan parametreleri geçirmek, ya da bir şekilde sonucu etkileyecek bir yolu olmalı? Genellikle, herhangi bir derleyici kod derleme Etkileşen, ama Delphi KOL hedefler sadece "" ve bu kadar. açma/kapama optimizasyon gibi görünüyor optimizasyonu için birçok seçenek olacaktır

LLVM oldukça sıkı ve mantıklı bir kod üretme yeteneğine sahip olması gerekiyordu, ama Delphi garip bir şekilde kendi imkanları kullanıyor gibi görünüyor. Delphi çok ağır yığını kullanmak istiyor, ve genel olarak sadece işlemci kaydeder r0-r3 geçici değişken olarak kullanır. Tüm delice, dört normal olarak 32 bit tamsayı yükleniyor gibi görünüyor 1 baytlık yük işlemleri belki de. Delphi daha iyi KOLU kodu üretmek nasıl ve bayt bayt güçlük Android için yapıyor olmadan?

Edit: ilk başta düşündüğüm bayt bayt yüklenmesi için takas bayt sırası arasında büyük indian, ama o değildi durumda, bu gerçekten sadece bir yükleme 32 bit sayısı ile 4 bayt yükler.

Edit2: Notlikethat yorum bunun için mantıklı bir açıklama verir: kelime-boyutlu tarafsız bir bellek yükü yapmadan. tam 32 bit yüklemek olabilir (kaçınmalısınız olup her şeyi derleyici bir hata olması için ipucu ister başka bir şey,)

Bu basit bir fonksiyon bakalım:

function ReadInteger(APInteger : PInteger) : Integer;
begin
  Result := APInteger^;
end;

En iyi duruma getirme açık olsa bile, güncelleme ile Delphi XE7 1 olarak XE6, bu işlev için aşağıdaki ARM assembly kodunu üretmek paketi:

Disassembly of section .text._ZN16Uarmcodetestform11ReadIntegerEPi:

00000000 <_ZN16Uarmcodetestform11ReadIntegerEPi>:
   0:   b580        push    {r7, lr}
   2:   466f        mov r7, sp
   4:   b083        sub sp, #12
   6:   9002        str r0, [sp, #8]
   8:   78c1        ldrb    r1, [r0, #3]
   a:   7882        ldrb    r2, [r0, #2]
   c:   ea42 2101   orr.w   r1, r2, r1, lsl #8
  10:   7842        ldrb    r2, [r0, #1]
  12:   7803        ldrb    r3, [r0, #0]
  14:   ea43 2202   orr.w   r2, r3, r2, lsl #8
  18:   ea42 4101   orr.w   r1, r2, r1, lsl #16
  1c:   9101        str r1, [sp, #4]
  1e:   9000        str r0, [sp, #0]
  20:   4608        mov r0, r1
  22:   b003        add sp, #12
  24:   bd80        pop {r7, pc}

Sadece talimatları ve bellek erişir sayısını Delphi bunun için ihtiyacı var. 4 ve 32-bit bir tamsayı yapım-yükler bayt... ben bu işlevi biraz değiştirmek ve bir işaretçi yerine var bir parametre kullanırsanız, biraz daha az karmaşık

Disassembly of section .text._ZN16Uarmcodetestform14ReadIntegerVarERi:

00000000 <_ZN16Uarmcodetestform14ReadIntegerVarERi>:
   0:   b580        push    {r7, lr}
   2:   466f        mov r7, sp
   4:   b083        sub sp, #12
   6:   9002        str r0, [sp, #8]
   8:   6801        ldr r1, [r0, #0]
   a:   9101        str r1, [sp, #4]
   c:   9000        str r0, [sp, #0]
   e:   4608        mov r0, r1
  10:   b003        add sp, #12
  12:   bd80        pop {r7, pc}

Demontaj burada da vardır vermeyeceğim, ama iOS için, Delphi pointer var ve parametre sürümleri için aynı kodu üretir ve hemen hemen ama tam olarak Android var parametre sürümü olarak aynı değiller. Edıt: açıklığa kavuşturmak için, byte-by-byte yükleme sadece Android. Ve sadece Android, işaretçi var ve parametre sürümleri birbirinden farklıdır. İOS sürümleri tam olarak aynı kodu oluşturur.

Karşılaştırma için, burada FPC 2.7.1 (Mart 2014 SVN trunk sürüm) optimizasyon seviyesi ile işlevi-O2 düşünüyor. İşaretçi var ve parametre sürümleri tam olarak aynıdır.

Disassembly of section .text.n_p$armcodetest_$$_readinteger$pinteger$$longint:

00000000 <P$ARMCODETEST_$$_READINTEGER$PINTEGER$$LONGINT>:

   0:   6800        ldr r0, [r0, #0]
   2:   46f7        mov pc, lr

Ben de Android Mall of Sofia ile birlikte C derleyici ile eşdeğer bir C fonksiyonu test.

int ReadInteger(int *APInteger)
{
    return *APInteger;
}

Ve bu temelde aynı şeyi FPC yaptı derler:

Disassembly of section .text._Z11ReadIntegerPi:

00000000 <_Z11ReadIntegerPi>:
   0:   6800        ldr r0, [r0, #0]
   2:   4770        bx  lr

CEVAP
26 Mayıs 2009, Salı


Tercih edilen yaklaşım, eğer makul ortasında onları koymak için önlemek eğer. 12 ** ancak.

Tarayıcılar genellikle tarayıcı Javascript dosya indirirken paralel olarak çeşitli sayfa öğeleri, ancak yük, Javascript indirme bitene kadar paralel başka sayfa öğeleri indirmek olmaz. Bu ne görüntü olarak daha altta komut taşımak için olduğu kadar beklemek zorunda kalacak ama eğer senaryonu küçük ise, o zaman korkacak bir şey olmaz anlamına gelir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Break

    Break

    10 Aralık 2005
  • Dave Wallace

    Dave Wallace

    27 Kasım 2007
  • Matthew Morrill

    Matthew Morr

    15 EKİM 2011