আমি ডি এর কিছু বৈশিষ্ট্য পছন্দ করি তবে তারা যদি রানটাইম পেনাল্টি নিয়ে আসে তবে আগ্রহী হবে?
তুলনা করার জন্য, আমি একটি সাধারণ প্রোগ্রাম বাস্তবায়ন করেছি যা সি ++ এবং ডি উভয় ক্ষেত্রে অনেক সংক্ষিপ্ত ভেক্টরের স্কেলার পণ্যগুলিকে গণনা করে ফলাফলটি অবাক করার মতো:
- ডি: 18.9 এস [চূড়ান্ত রানটাইমের জন্য নীচে দেখুন]
- সি ++: 3.8 এস
সি ++ আসলেই প্রায় পাঁচগুণ দ্রুত বা আমি ডি প্রোগ্রামটিতে ভুল করেছি?
আমি জি ++ -O3 (জিসিসি-স্ন্যাপশট 2011-02-19) এবং ডিএমডি-ও (ডিএমডি 2.052) সহ একটি মধ্যম সাম্প্রতিক লিনাক্স ডেস্কটপে সি ++ সংকলন করেছি। ফলাফলগুলি বেশ কয়েকটি রান এবং মানক বিচ্যুতির তুলনায় পুনরুত্পাদনযোগ্য l
এখানে সি ++ প্রোগ্রাম:
#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;
}
এবং এখানে ডি সংস্করণ:
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;
}
dmd ... trace.def
আমি একটি error: unrecognized file extension def
পেয়েছি opt এবং অপ্টলিংকের জন্য ডিএমডি ডক্সটিতে কেবল উইন্ডোজ উল্লেখ করা হয়েছে
avg = avg / N*N
(ক্রিয়াকলাপের ক্রম)।