Mevcut cevaplar, şeylerin donanım tarafına gerçekten değinmedi, bu yüzden bu açıdan biraz. Geleneksel bilgelik, çarpma ve bölmenin değişmekten çok daha yavaş olmasıdır, ancak bugünkü gerçek hikaye daha nüanslıdır.
Örneğin, çarpmanın donanımda uygulamak için daha karmaşık bir işlem olduğu kesinlikle doğrudur , ancak her zaman daha yavaş sonuçlanmayabilir . Sonuç olarak, add
uygulanması xor
(veya genel olarak herhangi bir bitsel işlemden) önemli ölçüde daha karmaşıktır , ancak add
(ve sub
) genellikle işlemlerine adanmış bitis operatörleri kadar hızlı olan yeterli transistör elde eder. Böylece donanım uygulama karmaşıklığına sadece hız için bir rehber olarak bakamazsınız.
Öyleyse, çarpma ve kaydırma gibi "tam" operatörlere karşı kaymaya ayrıntılı olarak bakalım.
değişken
Neredeyse tüm donanımlarda, sabit bir miktarda (yani derleyicinin derleme zamanında belirleyebileceği bir miktarda) kaydırma hızlıdır . Özellikle, genellikle tek bir döngü gecikmesi ve döngü başına 1 veya daha iyi bir verim ile gerçekleşir. Bazı donanımlarda (örneğin, bazı Intel ve ARM yongaları), bir sabit tarafından belirli kaymalar "ücretsiz" bile olabilir, çünkü bunlar başka bir talimata da yerleştirilebilir ( lea
Intel'de, ARM'deki ilk kaynağın özel kayma yetenekleri).
Değişken miktarda kaydırma, daha çok gri bir alandır. Eski donanımlarda bu bazen çok yavaştı ve hız nesilden nesile değişti. Örneğin, Intel'in P4'ün ilk sürümünde, değişken bir miktarda vites değiştirmek kötü bir şekilde yavaştı - vardiya miktarıyla orantılı zaman gerektiriyordu! Bu platformda, vardiyaların yerini almak için çarpımları kullanmak kârlı olabilir (yani, dünya tersine döndü). Önceki Intel yongalarında ve sonraki nesillerde, değişken bir miktarda kayma o kadar acı verici değildi.
Mevcut Intel yongalarında, değişken bir miktarda değiştirmek özellikle hızlı değildir, ancak korkunç değildir. Değişken vardiyalar söz konusu olduğunda x86 mimarisi hamstung, çünkü işlemi alışılmadık bir şekilde tanımladılar: vardiya 0 miktarları koşul bayraklarını değiştirmez, ancak diğer tüm vardiyalar yapar. Bu, bayrak kaydının etkin bir şekilde yeniden adlandırılmasını engeller, çünkü vardiya sonraki komutların vardiya tarafından yazılan koşul kodlarını mı yoksa bir önceki talimatı mı okuması gerektiğini belirleyene kadar belirlenemez. Ayrıca, vardiyalar sadece bayrak yazmacının bir kısmına yazarak kısmi bayrak duraklamasına neden olabilir.
Sonuç olarak, son Intel mimarilerinde, değişken bir miktarda kaydırmanın üç "mikro işlem" alması, diğer basit işlemlerin (ekleme, bitsel ops, hatta çarpma) yalnızca 1 almasıdır. .
Çarpma işlemi
Modern masaüstü ve dizüstü bilgisayar donanımındaki eğilim, çarpmayı hızlı bir işlem haline getirmektir. Son Intel ve AMD yongalarında, aslında, her döngüde bir çarpma verilebilir (buna karşılıklı verim diyoruz ). Gecikme , ancak, bir çarpma 3 döngüleri. Yani aracı almak olduğunu sonucunu başlattıktan sonra herhangi bir çarpma 3 döngü, ancak yeni bir çarpma her döngüyü başlatmak edebiliyoruz. Hangi değerin (1 döngü veya 3 döngü) daha önemli olduğu algoritmanızın yapısına bağlıdır. Çarpma kritik bir bağımlılık zincirinin parçasıysa, gecikme önemlidir. Değilse, karşılıklı verim veya diğer faktörler daha önemli olabilir.
Onlar anahtar paket servisi olan şey, modern dizüstü bilgisayar yongalarında (veya daha iyisi), çarpmanın hızlı bir işlem olması ve bir derleyicinin gücü azaltılmış vardiyalar için "yuvarlama" hakkını vereceği 3 veya 4 komut dizisinden daha hızlı olmasıdır. Değişken kaymalar için, Intel'de, yukarıda belirtilen sorunlar nedeniyle çarpma da genellikle tercih edilir.
Daha küçük form faktörlü platformlarda, tam ve hızlı bir 32 bit veya özellikle 64 bit çarpan oluşturmak çok fazla transistör ve güç gerektirdiğinden, çarpma hala daha yavaş olabilir. Birisi son mobil çiplerde çarpma performansının ayrıntılarını doldurabilirse çok takdir edilecektir.
bölmek
Bölme, hem çarpma işleminden daha donanımsal olarak daha karmaşık bir işlemdir ve aynı zamanda gerçek kodda çok daha az yaygındır - yani ona daha az kaynak tahsis edilir. Modern yongalardaki eğilim hala daha hızlı bölücülere doğru, ancak modern üst düzey yongalar bile bir bölünme yapmak için 10-40 döngü alıyor ve sadece kısmen boru hattında. Genel olarak, 64 bitlik bölünmeler 32 bitlik bölünmelerden bile daha yavaştır. Diğer birçok işlemden farklı olarak, bölme bağımsız değişkenlere bağlı olarak değişken sayıda döngü alabilir.
Ayırmaktan kaçının ve vardiyalarla değiştirin (veya derleyicinin yapmasına izin verin, ancak montajı kontrol etmeniz gerekebilir)!