Догнать C++
От: igor-booch Россия  
Дата: 23.07.21 11:57
Оценка:
https://habr.com/ru/company/jugru/blog/563988/

Он переписал обработку логов на Java с использованием LogStash на чистый (без фрэймворков) С++
Не честно, нужно было попробовать на чистом Java.
А на C# какими средствами можно было бы попробовать догнать C++ ?

ОС не умеет работать напрямую с диском и записывать байты прямо с него в пользовательские буферы. Сначала ОС подтягивает большой кусок файла в оперативную память и уже оттуда копирует байты в нужный контейнер.
Такой способ работы с файлами — стандартный, но большинство современных ОС могут работать лучше. Операционная система сразу даст доступ к этому фрагменту памяти и работать с ним можно будет без всякого копирования. Именно это делает boost::interprocess::mapped_region


Есть ли аналог FileStream без буфера, может только для Windows, за счёт тесной интеграции ОС с .NET или на Linux с помощью какого-нибудь драйвера?
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Отредактировано 23.07.2021 12:09 igor-booch . Предыдущая версия .
Re: Memory-mapped files
От: Qbit86 Кипр
Дата: 23.07.21 12:08
Оценка: 4 (1) +2
Здравствуйте, 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
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Memory-mapped files
От: igor-booch Россия  
Дата: 23.07.21 12:18
Оценка:
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)
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[3]: Memory-mapped files
От: Mr.Delphist  
Дата: 23.07.21 12:42
Оценка:
Здравствуйте, 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 с другими ОС, приходилось дорабатывать напильником.
Re: Догнать C++
От: Sharov Россия  
Дата: 23.07.21 14:13
Оценка: 4 (1)
Здравствуйте, igor-booch, Вы писали:

IB>Есть ли аналог FileStream без буфера, может только для Windows, за счёт тесной интеграции ОС с .NET или на Linux с помощью какого-нибудь драйвера?


WriteThrough?
Кодом людям нужно помогать!
Re: Догнать C++
От: Слава  
Дата: 23.07.21 14:45
Оценка: 4 (1) +1
Здравствуйте, igor-booch, Вы писали:

IB>

IB>ОС не умеет работать напрямую с диском и записывать байты прямо с него в пользовательские буферы. Сначала ОС подтягивает большой кусок файла в оперативную память и уже оттуда копирует байты в нужный контейнер.
IB>Такой способ работы с файлами — стандартный, но большинство современных ОС могут работать лучше. Операционная система сразу даст доступ к этому фрагменту памяти и работать с ним можно будет без всякого копирования. Именно это делает boost::interprocess::mapped_region


Это всё просто неверно. Можно читать байты с диска напрямую в пользовательский буфер, через DMA. В виндах это делается через определённые флаги CreateFile, при этом отключается дисковый кэш.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.