@SergeySerge11

Как оптимально организовать структуру памяти, Кучу? Как она реализована в виртуальных машинах?

Вопрос не по самой кучи и там алгоритмах сборки мусора, а по специфики C# c++, как, каким к примеру должен быть массив Heap.
Из байтов, int32-ов , int64? Типа машинных слов.
Как извлекать, и сохранять в него bool, byte, string, new byte[] мгновенно?
Все мои идеи и реализации в 5-10 раз медленнее. А как это у JVM? Там же как раз своя независимая куча,

Вопрос. Как происходит извлечение BOOL, BYTE, DOUBLE ? Точнее сколько операций происходит?
Можно ли за 1 операцию из массива байтов, взять 4 байта и закинуть в int Одной операцией?
C точки зрения процессора легко. А как программно это сделать, без всяких
Неужели JVM или там V8 движки крутят вместо 1 операции по 10-30?
// извлечь int из byteHeap[]; 
int a =  (((int)b[i])>>24) + (((int)b[i+1])>>16) + (((int)b[i+2] )>>8) + b[i+3]
 // почему вообще  моя реализация быстрее, чем кастомный BitConvert.ToInt32(arr,offset);  в 1.5 раза

То есть 4 приведения типа, 3 суммирования, и еще 3 сдвига и еще 3 сложения в получении адреса. 13 операций.
Дизассемблер выполняет 32 операции.
А максимально быстрый способ. То есть линейный, int a = arrInt[i] . всего 7 инструкций.
По тестам кстати примерно в 7 раз и быстрее, простой копирования. int -> int, от byte[4]-> .Неужели ни как за это же время 4 байта в int закинуть?
Хотя же можно просто взять линейно и перевеcти эти 4 бита, они же рядом(правда там задом наперед иногда). Есть ли такие операции?

Если брать массив int [] heap по 4 байта слово. То тогда как хранить извлекать байты. То есть опять такое делать, что в 7-10 раз будет медленнее.
Но виртуальные машины. JVM, V8 они же примерно за такое же время работают как и система. Помню сравнивал. То есть как у них это проблема реализована? , в разных исходниках я не нашел, или не понял
А это операция, извлечения типа из кучи, типа каждый раз будет. Как-то они из кучи мгновенно получают значения, а не через 10 >> сдвигов проворачивают.
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Там не происходиит копирование данных. Просто среда выаолнения запоминает, что переменная a лежит вон там внутри "массива" кучи. При чтении оттуда данных все происходит за одну асскмблерную операцию, как если бы вы читали из int.

Пишущим на си++ из-за концепции указателей это все должно быть понятнее. При выделении данных на куче просто какой-то указатель указывает куда-то в кучу и все.
Ответ написан
Комментировать
yarosroman
@yarosroman Куратор тега C#
C# the best
sharplab.io напишите код, и посмотрите как будет выглядеть asm после jit`а, только в release сборке.

ну и если уж совсем внутренности CLR интересны, советую начать с книг Саши Гольдштейна и Станислава Сидристого
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы