делаю неправильно? Почему вообще компилятор при оптимизации не выкидывает оба этих массива?https://godbolt.org/z/TbY87v8K6
reserve у динамического массива, похоже, что вообще ничего не делает в данном примере.
Оптимизации походу
у std.container.Array больше каких-то ограничений или из-за чего там насколько больше возможностей для оптимизации (не смотреть на gdc, там просто рандом какой-то)
У тебя неправильное количество памяти резервируется — в 100 раз меньше, это приводит к реаллокам, как вариант.
Ну возможно тут дело в том что llvm лучше работает с ручным выделением памяти, а gc ему меньше нравится. Вариант 2. Тут просто массив arr потом убирается gc, и malloc не обращается к ОС за памятью.
Без -O у меня как раз просто массив быстрее
вы же не предлагаете мне делать релизы из артефактов дебажной сборки? :))
хорошо, спасибо
Release сборка (с соответствующим флагом) ничего не меняет. Тут именно в оптимизациях дело — а вот как они влияют я не могу сказать.
под релизом я имелл ввиду сборку с двумя флагами -O -release, а не конкретно -release
Ну не на порядок. в 2 - 4 рза быстрее.
Хорошо. Видимо зависит от машины, нагрузок и так далее. Но тут дело не в GC. Встроенные массивы плохо подходят для таких множественных добавлений элементов, они для этого не оптимизированы. Если использовать std.array.Appender, заточенный под это, то ситуация меняется: https://godbolt.org/z/Pz7jMKM4j
Обсуждают сегодня