C ++ Почему диапазоны :: find_if так быстроC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C ++ Почему диапазоны :: find_if так быстро

Сообщение Anonymous »

Я изменил этот код:

Код: Выделить всё

auto it = chunks_.begin();
for (;; ++it) {
if (it == chunks_.end()) {
chunks_.emplace_back();
alloc_chunk_ = &chunks_.back();
break;
}
if (!it->is_filled()) {
alloc_chunk_ = &*it;
break;
}
}
< /code>
до этого: < /p>
auto it = std::ranges::find_if(
chunks_, [](const auto &chunk) { return !chunk.is_filled(); });
if (it == chunks_.end()) {
chunks_.emplace_back();
alloc_chunk_ = &chunks_.back();
} else {
alloc_chunk_ = &*it;
}
и в gcc 11.2 -O3, и в MSVC 19.32 /Ox вторая версия была почти в 20 раз быстрее. (других изменений кода не было) std :: vector и chunks_.size () составлял приблизительно 500, а цикл был выполнен примерно в 100 000 раз. Первый код составлял около 500 мс, второй код составлял около 30 мс (включая все остальные коды, поэтому ясно, что эта часть была узким местом)
Это Chunk s:

Код: Выделить всё

struct Chunk {
// ... other details ...

[[nodiscard]] bool is_filled() const { return !blocks_available_; }

unsigned char data_[num_blocks_];
unsigned char first_available_ = 0;
unsigned char blocks_available_ = num_blocks_;
};
Почему компилятор так быстро оптимизирует std::ranges::find_if?

Подробнее здесь: https://stackoverflow.com/questions/730 ... is-so-fast
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»