এটি কাজটি করেছে (২০১২ সালে):
#include <stdio.h>
const unsigned long long size = 8ULL*1024ULL*1024ULL;
unsigned long long a[size];
int main()
{
FILE* pFile;
pFile = fopen("file.binary", "wb");
for (unsigned long long j = 0; j < 1024; ++j){
//Some calculations to fill a[]
fwrite(a, 1, size*sizeof(unsigned long long), pFile);
}
fclose(pFile);
return 0;
}
আমি সবে মাত্র ৩ জিবি টাইম করেছি sec জিএস, যা প্রায় ২২০ এমবি / সে এবং আমি মনে করি যে আমার এসএসডিটি সর্বাধিক বাড়িয়েছে। এছাড়াও লক্ষণীয়, প্রশ্নের কোডটিতে একটি কোর ব্যবহৃত হয়েছে 100%, এই কোডটি কেবল 2-5% ব্যবহার করে।
সবাইকে অনেক অনেক ধন্যবাদ
আপডেট : 5 বছর কেটে গেছে এখন 2017। সংকলক, হার্ডওয়্যার, গ্রন্থাগার এবং আমার প্রয়োজনীয়তা পরিবর্তন হয়েছে। এজন্য আমি কোডে কিছু পরিবর্তন করেছি এবং কিছু নতুন পরিমাপ করেছি।
প্রথমে কোডটি আপ করুন:
#include <fstream>
#include <chrono>
#include <vector>
#include <cstdint>
#include <numeric>
#include <random>
#include <algorithm>
#include <iostream>
#include <cassert>
std::vector<uint64_t> GenerateData(std::size_t bytes)
{
assert(bytes % sizeof(uint64_t) == 0);
std::vector<uint64_t> data(bytes / sizeof(uint64_t));
std::iota(data.begin(), data.end(), 0);
std::shuffle(data.begin(), data.end(), std::mt19937{ std::random_device{}() });
return data;
}
long long option_1(std::size_t bytes)
{
std::vector<uint64_t> data = GenerateData(bytes);
auto startTime = std::chrono::high_resolution_clock::now();
auto myfile = std::fstream("file.binary", std::ios::out | std::ios::binary);
myfile.write((char*)&data[0], bytes);
myfile.close();
auto endTime = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
}
long long option_2(std::size_t bytes)
{
std::vector<uint64_t> data = GenerateData(bytes);
auto startTime = std::chrono::high_resolution_clock::now();
FILE* file = fopen("file.binary", "wb");
fwrite(&data[0], 1, bytes, file);
fclose(file);
auto endTime = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
}
long long option_3(std::size_t bytes)
{
std::vector<uint64_t> data = GenerateData(bytes);
std::ios_base::sync_with_stdio(false);
auto startTime = std::chrono::high_resolution_clock::now();
auto myfile = std::fstream("file.binary", std::ios::out | std::ios::binary);
myfile.write((char*)&data[0], bytes);
myfile.close();
auto endTime = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
}
int main()
{
const std::size_t kB = 1024;
const std::size_t MB = 1024 * kB;
const std::size_t GB = 1024 * MB;
for (std::size_t size = 1 * MB; size <= 4 * GB; size *= 2) std::cout << "option1, " << size / MB << "MB: " << option_1(size) << "ms" << std::endl;
for (std::size_t size = 1 * MB; size <= 4 * GB; size *= 2) std::cout << "option2, " << size / MB << "MB: " << option_2(size) << "ms" << std::endl;
for (std::size_t size = 1 * MB; size <= 4 * GB; size *= 2) std::cout << "option3, " << size / MB << "MB: " << option_3(size) << "ms" << std::endl;
return 0;
}
এই কোডটি ভিজ্যুয়াল স্টুডিও 2017 এবং জি ++ 7.2.0 (একটি নতুন প্রয়োজনীয়তা) দিয়ে সংকলন করে। আমি দুটি সেটআপ দিয়ে কোডটি চালিয়েছি:
- ল্যাপটপ, কোর আই 7, এসএসডি, উবুন্টু 16.04, জি ++ সংস্করণ 7.2.0 সহ -এসডি = সি ++ 11 -মার্চ = নেটিভ -O3
- ডেস্কটপ, কোর আই 7, এসএসডি, উইন্ডোজ 10, ভিজ্যুয়াল স্টুডিও 2017 সংস্করণ 15.3.1 সাথে / অক্স / ওবি 2 / ওআই / ওটি / জিটি / জিএল / জিআই
যা নিম্নলিখিত
পদক্ষেপগুলি দিয়েছে (1MB এর জন্য মানগুলি খোলার পরে, কারণ তারা সুস্পষ্ট আউটলিয়ার ছিল):
আমার এসএসডি থেকে বিকল্প সময় 1 এবং অপশন 3 উভয়ই সর্বোচ্চ। আমি এটি দেখার আশা করিনি, কারণ অপশন 2 তখন আমার পুরানো মেশিনের সবচেয়ে দ্রুততম কোড হিসাবে ব্যবহৃত হত।
টিএল; ডিআর : আমার পরিমাপটি std::fstream
ওভার ব্যবহারের জন্য নির্দেশ করে FILE
।