Здравствуйте, void29091988, Вы писали:
V>Добрый день, уважаемые участники форума!
V>Сегодня столкнулся с интересным фактом, который немного меня удивил.
V>Пишу 2 простейших приложения для записи в файл на управляемом(C#) и неуправляемом(C++) коде
Попробуйте этот код на C++
int _tmain(int argc, _TCHAR* argv[])
{
PerfCounter pc;
pc.Start();
FILE* outs = _tfopen(_T("C:\\1.txt"), _T("ab"));
char* buffer = new char[10000];
for (int i = 0; i < 10000 / 4 - 1; i++)
((int*)buffer)[i] = 0x44444444; // 4 symbol 'D'
((int*)buffer)[10000 / 4 - 1] = 0x00444444; // 3 symbol 'D' and last '\x0'
fwrite(buffer, 10000, 1, outs);
fclose(outs);
float t = pc.Finish();
_tprintf(_T("%f"), t);
return 0;
}
Здравствуйте, yartat, Вы писали:
Y>Попробуйте этот код на C++
Y>Y>int _tmain(int argc, _TCHAR* argv[])
Y>{
Y> PerfCounter pc;
Y> pc.Start();
Y> FILE* outs = _tfopen(_T("C:\\1.txt"), _T("ab"));
Y> char* buffer = new char[10000];
Y> for (int i = 0; i < 10000 / 4 - 1; i++)
Y> ((int*)buffer)[i] = 0x44444444; // 4 symbol 'D'
Y> ((int*)buffer)[10000 / 4 - 1] = 0x00444444; // 3 symbol 'D' and last '\x0'
Y> fwrite(buffer, 10000, 1, outs);
Y> fclose(outs);
Y> float t = pc.Finish();
Y> _tprintf(_T("%f"), t);
Y> return 0;
Y>}
Y>
И тот код был не показатель, а этот — вообще чушь. Только и годится, что одним символом заполнять файл.
И раз Вы сделали такое с C++ версией, то и с версией C# надо было поступить точно так же.
З.Ы. В исходной версии теста метод frpintf выполнялся в цикле 10000 раз, а у Вас fwrite — лишь однажды...
Здравствуйте, samius, Вы писали:
S>И тот код был не показатель, а этот — вообще чушь.
Не желаете объяснить?
S>З.Ы. В исходной версии теста метод frpintf выполнялся в цикле 10000 раз, а у Вас fwrite — лишь однажды...
Да, я заметил это уже после публикации
int _tmain(int argc, _TCHAR* argv[])
{
char* buffer = new char[10000];
for (int i = 0; i < 10000 / 4 - 1; i++)
((int*)buffer)[i] = 0x44444444; // 4 symbol 'D'
((int*)buffer)[10000 / 4 - 1] = 0x00444444; // 3 symbol 'D' and last '\x0'
PerfCounter pc;
pc.Start();
FILE* outs = _tfopen(_T("C:\\1.txt"), _T("wbS"));
__asm
{
align 16
}
for (int i = 0; i < 10000; i++)
fwrite(buffer, 10000, 1, outs);
fclose(outs);
float t = pc.Finish();
_tprintf(_T("%f"), t);
return 0;
}
используйте memory-mapped files и будет Вам скорость.
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
const size_t elementCount = 10000;
const size_t writeCount = 10000;
const LARGE_INTEGER size = {elementCount * writeCount, 0};
vector<unsigned char> buffer;
buffer.resize(elementCount);
fill(buffer.begin(), buffer.end(), 'D');
PerfCounter pc;
pc.Start();
const HANDLE fileHandle = ::CreateFile(TEXT("C:\\1.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
const HANDLE mappingHandle = ::CreateFileMapping(fileHandle, NULL, PAGE_READWRITE, size.HighPart, size.LowPart, NULL);
::CloseHandle(fileHandle);
void* const mapping = ::MapViewOfFile(mappingHandle, FILE_MAP_WRITE, 0, 0, 0);
::CloseHandle(mappingHandle);
stdext::checked_array_iterator<unsigned char*> iterator =
stdext::make_checked_array_iterator(reinterpret_cast<unsigned char*>(mapping), static_cast<size_t>(size.QuadPart));
for (size_t i = 0; i < writeCount; i++)
iterator = copy(buffer.begin(), buffer.end(), iterator);
::UnmapViewOfFile(mapping);
cout << pc.Finish() << endl;
return 0;
}
требует примерно 20мс.
Здравствуйте, superlexx, Вы писали:
S>используйте memory-mapped files и будет Вам скорость.int _tmain(int argc, _TCHAR* argv[])
S>{
S> using namespace std;
S> const size_t elementCount = 10000;
S> const size_t writeCount = 10000;
S> const LARGE_INTEGER size = {elementCount * writeCount, 0};
S> vector<unsigned char> buffer;
S> buffer.resize(elementCount);
S> fill(buffer.begin(), buffer.end(), 'D');
S> PerfCounter pc;
S> pc.Start();
S> const HANDLE fileHandle = ::CreateFile(TEXT("C:\\1.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
S> const HANDLE mappingHandle = ::CreateFileMapping(fileHandle, NULL, PAGE_READWRITE, size.HighPart, size.LowPart, NULL);
S> ::CloseHandle(fileHandle);
S> void* const mapping = ::MapViewOfFile(mappingHandle, FILE_MAP_WRITE, 0, 0, 0);
S> ::CloseHandle(mappingHandle);
S> stdext::checked_array_iterator<unsigned char*> iterator =
S> stdext::make_checked_array_iterator(reinterpret_cast<unsigned char*>(mapping), static_cast<size_t>(size.QuadPart));
S> for (size_t i = 0; i < writeCount; i++)
S> iterator = copy(buffer.begin(), buffer.end(), iterator);
S> ::UnmapViewOfFile(mapping);
S> cout << pc.Finish() << endl;
S> return 0;
S>}
S>
требует примерно 20мс.
огромное спасибо, то, что нужно