Re: Производительность управляемого и неуправляемого кода
От: yartat  
Дата: 30.04.09 08:32
Оценка:
Здравствуйте, 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;
}
Re[2]: Производительность управляемого и неуправляемого кода
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.04.09 08:48
Оценка:
Здравствуйте, 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 — лишь однажды...
Re[3]: Производительность управляемого и неуправляемого кода
От: yartat  
Дата: 30.04.09 08:54
Оценка:
Здравствуйте, 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;
}
Re: Производительность управляемого и неуправляемого кода
От: superlexx  
Дата: 30.04.09 11:53
Оценка: 2 (1)
используйте 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мс.
Re[2]: Производительность управляемого и неуправляемого кода
От: void29091988  
Дата: 15.05.09 15:32
Оценка:
Здравствуйте, 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мс.


огромное спасибо, то, что нужно
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.