LINUX.ORG.RU

История изменений

Исправление asaw, (текущая версия) :

А какая альтернатива?

Должен заметить, что в моем случае я столкнулся с проблемами в основном под виндой. Решение было такое:

    FILE* stream = _wfsopen(path.c_str(), L"rbS", _SH_DENYWR);
    if (stream != nullptr) {
        std::ifstream newIfs(stream);
        if (newIfs.good()) {
            success = true;
            ifs.swap(newIfs);
        }
        else
            fclose(stream);
    }

То есть это stdio вместе с iostreams. И вот это вот позволило поднять производительность минимум в 30 раз - далее уже сеть стала узким местом. Сами по себе iostreams тормозом не являются.

P.S. В данном конкретном примере у использования stdio и iostreams есть другой минус - в оффтопике есть жесткий лимит на число одновременно открытых файловых дескрипторов из stdio и он смехотворно низок - всего 2048 (по умолчанию и вовсе 512). Причем, нужно помнить, что сокеты используют те же дескрипторы. То есть решение всё равно получается ограниченным даже если бы в iostreams был бы нужный флажок. А в Win32 API такого ограничения нет. Правильное кроссплатформенное решение должно учитывать и такие особенности.

Исходная версия asaw, :

А какая альтернатива?

Должен заметить, что в моем случае я столкнулся с проблемами в основном под виндой. Решение было такое:

c++

FILE* stream = _wfsopen(path.c_str(), L"rbS", _SH_DENYWR); if (stream != nullptr) { std::ifstream newIfs(stream); if (newIfs.good()) { success = true; ifs.swap(newIfs); } else fclose(stream); }

То есть это stdio вместе с iostreams. И вот это вот позволило поднять производительность минимум в 30 раз - далее уже сеть стала узким местом. Сами по себе iostreams тормозом не являются.

P.S. В данном конкретном примере у использования stdio и iostreams есть другой минус - в оффтопике есть жесткий лимит на число одновременно открытых файловых дескрипторов из stdio и он смехотворно низок - всего 2048 (по умолчанию и вовсе 512). Причем, нужно помнить, что сокеты используют те же дескрипторы. То есть решение всё равно получается ограниченным даже если бы в iostreams был бы нужный флажок. А в Win32 API такого ограничения нет. Правильное кроссплатформенное решение должно учитывать и такие особенности.