Nie widzę różnicy między std :: stream / FILE / device. Między buforowaniem a brakiem buforowania.
Uwaga:
- Dyski SSD „mają tendencję” do zwalniania (niższe prędkości przesyłu) w miarę zapełniania się.
- Dyski SSD „mają tendencję” do spowolnienia (niższe prędkości transferu) w miarę starzenia się (z powodu niedziałających bitów).
Widzę, że kod działa w 63 sekundy.
Zatem szybkość transferu: 260 M / s (mój dysk SSD wygląda nieco szybciej niż twój).
64 * 1024 * 1024 * 8 /*sizeof(unsigned long long) */ * 32 /*Chunks*/
= 16G
= 16G/63 = 260M/s
Nie otrzymuję wzrostu, przechodząc do FILE * ze std :: fstream.
#include <stdio.h>
using namespace std;
int main()
{
FILE* stream = fopen("binary", "w");
for(int loop=0;loop < 32;++loop)
{
fwrite(a, sizeof(unsigned long long), size, stream);
}
fclose(stream);
}
Tak więc strumień C ++ działa tak szybko, jak na to pozwala podstawowa biblioteka.
Ale myślę, że niesprawiedliwe jest porównywanie systemu operacyjnego z aplikacją zbudowaną na systemie operacyjnym. Aplikacja nie może przyjmować żadnych założeń (nie wie, że dyski są dyskami SSD), dlatego do przesyłania używa mechanizmów plików systemu operacyjnego.
Chociaż system operacyjny nie musi przyjmować żadnych założeń. Potrafi określić typy zaangażowanych napędów i zastosować optymalną technikę przesyłania danych. W tym przypadku bezpośredni transfer z pamięci do pamięci. Spróbuj napisać program, który kopiuje 80G z jednej lokalizacji w pamięci do innej i sprawdź, jak szybko to jest.
Edytować
Zmieniłem kod, aby korzystać z wywołań niższego poziomu:
tj. Bez buforowania.
#include <fcntl.h>
#include <unistd.h>
const unsigned long long size = 64ULL*1024ULL*1024ULL;
unsigned long long a[size];
int main()
{
int data = open("test", O_WRONLY | O_CREAT, 0777);
for(int loop = 0; loop < 32; ++loop)
{
write(data, a, size * sizeof(unsigned long long));
}
close(data);
}
Nie miało to żadnej różnicy.
UWAGA : Mój dysk jest dyskiem SSD, jeśli masz normalny dysk, możesz zauważyć różnicę między dwiema powyższymi technikami. Ale, jak się spodziewałem, buforowanie i buforowanie (przy zapisywaniu dużych fragmentów większych niż rozmiar bufora) nie ma znaczenia.
Edycja 2:
Czy wypróbowałeś najszybszą metodę kopiowania plików w C ++
int main()
{
std::ifstream input("input");
std::ofstream output("ouptut");
output << input.rdbuf();
}