Разница между последовательной записью и случайной записью

Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.

Была функция с ключевым словом export, которая была предназначенный для отдельной компиляции. Функция export устарела в C++11 и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export. Отдельная компиляция невозможна в C++ или C++11, но, возможно, в C++17, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.

Для отдельной компиляции, которая должна быть достигнута, разделить проверка шаблона тела должна быть возможна. Кажется, что решение возможно с концепциями. Взгляните на этот документ , недавно представленный на совещании по стандартам. Я думаю, что это не единственное требование, поскольку вам все равно необходимо создать код кода шаблона в коде пользователя.

Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.

35
задан Kaizen 20 January 2010 в 10:23
поделиться

1 ответ

Когда люди говорят о последовательной и случайной записи в файл, они обычно проводят различие между записью без промежуточных поисков («последовательная») и шаблоном записи искать-писать-искать-писать-искать-писать и т. д. ("случайный").

Это различие очень важно в традиционных дисковых системах, где каждый поиск по диску занимает около 10 мс. Последовательная запись данных на тот же диск занимает около 30 мс на МБ. Таким образом, если вы последовательно записываете на диск 100 МБ данных, это займет около 3 секунд. Но если вы выполните 100 случайных операций записи по 1 МБ каждая, это займет в общей сложности 4 секунды (3 секунды для фактической записи и 10 мс * 100 == 1 секунда для всех поисков).

По мере того, как каждая случайная запись становится меньше, вы платите все больше и больше штрафов за поиск диска. В крайнем случае, когда вы выполняете 100 миллионов случайных 1-байтовых операций записи, вы все равно получите 3 секунды для всех фактических операций записи, но теперь у вас будет 11,57 дней на поиски! Таким образом, очевидно, что степень, в которой ваши записи являются последовательными или случайными, действительно может повлиять на время, необходимое для выполнения вашей задачи.

Немного другая ситуация со вспышкой. С флеш-памятью у вас нет физической головки диска, которую вы должны перемещать. (Отсюда стоимость поиска 10 мс для традиционного диска). Однако флэш-устройства, как правило, имеют большие размеры страниц (наименьший «типичный» размер страницы составляет около 512 байт согласно wikipedia , и размеры страниц 4K также являются обычным явлением).Поэтому, если вы пишете небольшое количество байтов, flash по-прежнему имеет накладные расходы, так как вы должны считывать всю страницу, изменять записываемые байты, а затем записывать обратно всю страницу. Я не знаю характерных цифр для вспышек с макушки. Но эмпирическое правило заключается в том, что во флэш-памяти, если каждая из ваших операций записи обычно сопоставима по размеру с размером страницы устройства, вы не увидите большой разницы в производительности между случайной и последовательной записью. Если каждая из ваших операций записи мала по сравнению с размером страницы устройства, вы увидите некоторые накладные расходы при выполнении произвольной записи.

Что касается всего вышеперечисленного, это правда, что на уровне приложений многое скрыто от вас. В ядре, контроллере диска / флэш-памяти и т. Д. Есть уровни, которые могут, например, вставлять неочевидные запросы в середине вашей «последовательной» записи. Но в большинстве случаев запись, которая «выглядит» последовательно на уровне приложения (без поисков, много непрерывных операций ввода-вывода), будет иметь производительность последовательной записи, в то время как запись, которая «выглядит» случайным образом на уровне приложения, будет иметь (обычно хуже) производительность произвольной записи.

85
ответ дан 27 November 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: