Ne kadar hızlı C göre D ?
D bazı özelliklerini seviyorum, ama eğer bir gelirlerse ister çalışma cezası?
Karşılaştırmak için, hem de şaşırtıcı bir sonucudur D. C: çok kısa vektörün skaler ürünleri hesaplayan basit bir program uygulanmaktadır
- D: [aşağıya bakınız Son zamanı] 18.9
- C : s 3.8
C gerçekten neredeyse beş kat daha hızlı ya ben D bir hata yaptı. program?
G ile C-O3 (gcc-anlık 2011-02-19) ve orta son masaüstünde olağanüstü başarılı sonuçlar verebilen-D (dmd 2.052) derlenmiş. Sonuçları birkaç çalışır üzerinde tekrarlanabilir ve standart sapma yok denecek kadar azdır.
Burada C program:
#include <iostream>
#include <random>
#include <chrono>
#include <string>
#include <vector>
#include <array>
typedef std::chrono::duration<long, std::ratio<1, 1000>> millisecs;
template <typename _T>
long time_since(std::chrono::time_point<_T>& time) {
long tm = std::chrono::duration_cast<millisecs>( std::chrono::system_clock::now() - time).count();
time = std::chrono::system_clock::now();
return tm;
}
const long N = 20000;
const int size = 10;
typedef int value_type;
typedef long long result_type;
typedef std::vector<value_type> vector_t;
typedef typename vector_t::size_type size_type;
inline value_type scalar_product(const vector_t& x, const vector_t& y) {
value_type res = 0;
size_type siz = x.size();
for (size_type i = 0; i < siz; i)
res = x[i] * y[i];
return res;
}
int main() {
auto tm_before = std::chrono::system_clock::now();
// 1. allocate and fill randomly many short vectors
vector_t* xs = new vector_t [N];
for (int i = 0; i < N; i) {
xs[i] = vector_t(size);
}
std::cerr << "allocation: " << time_since(tm_before) << " ms" << std::endl;
std::mt19937 rnd_engine;
std::uniform_int_distribution<value_type> runif_gen(-1000, 1000);
for (int i = 0; i < N; i)
for (int j = 0; j < size; j)
xs[i][j] = runif_gen(rnd_engine);
std::cerr << "random generation: " << time_since(tm_before) << " ms" << std::endl;
// 2. compute all pairwise scalar products:
time_since(tm_before);
result_type avg = 0;
for (int i = 0; i < N; i)
for (int j = 0; j < N; j)
avg = scalar_product(xs[i], xs[j]);
avg = avg / N*N;
auto time = time_since(tm_before);
std::cout << "result: " << avg << std::endl;
std::cout << "time: " << time << " ms" << std::endl;
}
Ve burada D sürümü:
import std.stdio;
import std.datetime;
import std.random;
const long N = 20000;
const int size = 10;
alias int value_type;
alias long result_type;
alias value_type[] vector_t;
alias uint size_type;
value_type scalar_product(const ref vector_t x, const ref vector_t y) {
value_type res = 0;
size_type siz = x.length;
for (size_type i = 0; i < siz; i)
res = x[i] * y[i];
return res;
}
int main() {
auto tm_before = Clock.currTime();
// 1. allocate and fill randomly many short vectors
vector_t[] xs;
xs.length = N;
for (int i = 0; i < N; i) {
xs[i].length = size;
}
writefln("allocation: %i ", (Clock.currTime() - tm_before));
tm_before = Clock.currTime();
for (int i = 0; i < N; i)
for (int j = 0; j < size; j)
xs[i][j] = uniform(-1000, 1000);
writefln("random: %i ", (Clock.currTime() - tm_before));
tm_before = Clock.currTime();
// 2. compute all pairwise scalar products:
result_type avg = cast(result_type) 0;
for (int i = 0; i < N; i)
for (int j = 0; j < N; j)
avg = scalar_product(xs[i], xs[j]);
avg = avg / N*N;
writefln("result: %d", avg);
auto time = Clock.currTime() - tm_before;
writefln("scalar products: %i ", time);
return 0;
}
CEVAP
Tüm en iyi duruma getirmeleri etkinleştir ve tüm güvenlik kontrolleri devre dışı bırakmak için, aşağıdaki olağanüstü başarılı sonuçlar verebilen bayrakları ile D programınızı derleme:
-O -inline -release -noboundscheck
EDİT: G , olağanüstü başarılı sonuçlar verebilen ve kadın-Im ile programları denedim. olağanüstü başarılı sonuçlar verebilen gerisinde, ama kadın-Im performans g çok yakın ulaşır . Kullanılan komut gdmd -O -release -inline
(gdmd olağanüstü başarılı sonuçlar verebilen bir seçenek kabul eden kadın-Im etrafında sarıcı ifadesidir).
Çevirici Listeleme bakarak, ne olağanüstü başarılı sonuçlar verebilen ne de kadın-Im scalar_product
, ama g /kadın-Im inlined, BİRKAÇ talimatları yayarlar mi, otomatik vectorizing döngü olabilir gibi görünüyor.
Neden bu kadar inanılmaz derecede hızl...
Ne kadar Hızlı bir proje ile Cocoapods...
Kadar saymak için daha aşağı saymak iç...
Ne kadar hızlı Javascript bir Nesne te...
ETMENİZ neden bu kadar hızlı NEREYE ba...