Очень быстро, легко видеть (прямо в корне, присваивая нули) и массивные релизы могут превратить GC в нетерпение, и вся идея куки-локальной кучи - это хороший сон :-) Даже если вы полностью разделились потоки-локальные кучи (которых у вас нет) таблица указателей ручек все равно должна быть полностью волатильной, чтобы сделать безопасным для общих сценариев с несколькими процессорами. О, и помните, что есть много потоков, кэш центрального процессора разделен, необходимо, чтобы ядро нуждалось в приоритете, так что это не все для вас :-)
Также обратите внимание на то, что «куча» с двумя указателями имеет 2 части - блок памяти для дайте и указатель-указатель (чтобы блоки могли перемещаться, но ваш код всегда имел один адрес). Такая таблица является критическим, но очень скудным ресурсом уровня процесса и почти единственным способом подчеркнуть, что она наводняет его массивными быстрыми выпусками - так что вам удалось это сделать :-))
В целом правило GC это - утечка :-) Не навсегда, конечно, но вроде так долго, как только можешь. Если вы помните, как люди ходят, говоря «не заставляйте коллекцию GC»? Это часть истории. Кроме того, коллекция «stop the world» на самом деле намного эффективнее, чем «параллельная» и известна более красивым названием кражи цикла или сотрудничества с планировщиком. Только фазе отметки нужно заморозить планировщик, а на сервере есть пакет из нескольких потоков (N ядер в любом случае простаивает :-) Единственная причина для другой - это то, что он может делать операции в реальном времени, такие как воспроизведение видео, jittery , так же как и более длинный квант потока.
Итак, если вы идете конкурировать с инфраструктурой на короткие и частые всплески процессора (небольшой разряд, практически без работы, быстрый выпуск), единственное, что вы увидите/измеряете, - это шум GC и JIT.
Если это было для чего-то реального, т. Е. Не просто для экспериментов, лучше всего использовать большие массивы значений в стеке (structs). Они не могут быть принуждены к куче и локальны, как может получить местный, и не подвержены какому-либо обратному движению => кэш должен любить их :-) Это может означать переход в «небезопасный» режим с использованием обычных указателей и, возможно, (если yopu нужно что-то простое, как списки), но это небольшая цена, чтобы заплатить за выбивание GC :-) Попытка заставить данные в кеш также зависит от того, чтобы ваши стопки опирались в противном случае - помните, что вы не одиноки. Также давая вашим потокам некоторую работу, которая стоит, по крайней мере, несколько квантов, которые могут помочь в выпусках. В худшем случае сценарий был бы, если вы выделите и освободите в пределах квантового знака.
Определите, что вы подразумеваете под «без масштабируемости». –
вам лучше разместить точную методологию, то, что вы измерили, как вы измеряли и измеряли значения. –
Я предполагаю, что здесь, но я, возможно, Джон Харроп выполнял свой тест на N-ядерном компьютере и делал свой тест с n = 1 до N потоков. Тогда масштабирование - это то, как скорость теста изменяется с n. –