https://habr.com/ru/company/jugru/blog/563988/
Он переписал обработку логов на Java с использованием LogStash на чистый (без фрэймворков) С++
Не честно, нужно было попробовать на чистом Java.
А на C# какими средствами можно было бы попробовать догнать C++ ?
ОС не умеет работать напрямую с диском и записывать байты прямо с него в пользовательские буферы. Сначала ОС подтягивает большой кусок файла в оперативную память и уже оттуда копирует байты в нужный контейнер.
Такой способ работы с файлами — стандартный, но большинство современных ОС могут работать лучше. Операционная система сразу даст доступ к этому фрагменту памяти и работать с ним можно будет без всякого копирования. Именно это делает boost::interprocess::mapped_region
Есть ли аналог FileStream без буфера, может только для Windows, за счёт тесной интеграции ОС с .NET или на Linux с помощью какого-нибудь драйвера?
Здравствуйте, igor-booch, Вы писали:
IB>А на C# какими средствами можно было бы попробовать догнать C++ ?
IB>Именно это делает boost::interprocess::mapped_region
IB>Есть ли аналог FileStream без буфера?
Может, memory-mapped files?
[1] Memory-mapped files:
https://docs.microsoft.com/en-us/dotnet/standard/io/memory-mapped-files
[2] MemoryMappedFile Class:
https://docs.microsoft.com/en-us/dotnet/api/system.io.memorymappedfiles.memorymappedfile?view=net-5.0
Q>Может, memory-mapped files?
Q>[1] Memory-mapped files: https://docs.microsoft.com/en-us/dotnet/standard/io/memory-mapped-files
Q>[2] MemoryMappedFile Class: https://docs.microsoft.com/en-us/dotnet/api/system.io.memorymappedfiles.memorymappedfile?view=net-5.0
Может, похоже MemoryMappedFile работают через WinApi.
А boost::interprocess::mapped_region тоже интересно через WinApi?
Похоже что может по-разному
https://www.boost.org/doc/libs/1_46_0/boost/interprocess/mapped_region.hpp
#if (defined BOOST_INTERPROCESS_WINDOWS)
# include <boost/interprocess/detail/win32_api.hpp>
#else
# ifdef BOOST_HAS_UNISTD_H
# include <fcntl.h>
# include <sys/mman.h> //mmap
# include <unistd.h>
# include <sys/stat.h>
# include <sys/types.h>
# if defined(BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS)
# include <sys/shm.h> //System V shared memory...
# endif
# include <boost/assert.hpp>
# else
# error Unknown platform
# endif
#endif //#if (defined BOOST_INTERPROCESS_WINDOWS)
Здравствуйте, igor-booch, Вы писали:
IB>Может, похоже MemoryMappedFile работают через WinApi.
IB>А boost::interprocess::mapped_region тоже интересно через WinApi?
IB>Похоже что может по-разному
IB>https://www.boost.org/doc/libs/1_46_0/boost/interprocess/mapped_region.hpp
Не знаю как сейчас — но раньше бустовые Memory-mapped работали через WinApi, причём не используя всех возможностей в угоду унификации API с другими ОС, приходилось дорабатывать напильником.
Здравствуйте, igor-booch, Вы писали:
IB>Есть ли аналог FileStream без буфера, может только для Windows, за счёт тесной интеграции ОС с .NET или на Linux с помощью какого-нибудь драйвера?
WriteThrough?
Здравствуйте, igor-booch, Вы писали:
IB>IB>ОС не умеет работать напрямую с диском и записывать байты прямо с него в пользовательские буферы. Сначала ОС подтягивает большой кусок файла в оперативную память и уже оттуда копирует байты в нужный контейнер.
IB>Такой способ работы с файлами — стандартный, но большинство современных ОС могут работать лучше. Операционная система сразу даст доступ к этому фрагменту памяти и работать с ним можно будет без всякого копирования. Именно это делает boost::interprocess::mapped_region
Это всё просто неверно. Можно читать байты с диска напрямую в пользовательский буфер, через DMA. В виндах это делается через определённые флаги CreateFile, при этом отключается дисковый кэш.