Список в T [] без копирования

Arno, эта ссылка могла бы привести Вас к решению. Удача.

Can' t начальная загрузка без Флеш-накопителя включил

27
задан Hannesh 11 February 2011 в 19:13
поделиться

2 ответа

Вы можете подумать, если ваш подход к этому неправильный. Если вы обнаружите, что для этого используете рефлексию - вы уже проиграли.

Я могу придумать несколько способов приблизиться к этому, хотя какой из них идеален, во многом зависит от того, является ли это многопоточным фрагментом кода или нет.

Давайте предположим, что это не ...

Подумайте о характеристиках массива. Каждый раз, когда этот метод вызывается, создается массив N-длины. Ваша цель - повысить производительность (что означает, что вы хотите минимизировать выделение ресурсов и копирование данных).

Можете ли вы подсказать при компиляции или во время выполнения, какой идеальный начальный размер для массива? Я имею в виду - если в 95% случаев длина N равна 100 КБ или меньше ... начните с массива элементов 100 КБ. Продолжайте использовать его, пока не попадете в случай, когда массив слишком мал.

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

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

Другими словами, я предлагаю, чтобы вы не использовали метод List-to-Array и предварительно выделяли массив, сохраняли его вечно и увеличивали его по мере необходимости.

Если в вашей программе есть проблемы с многопоточностью, вам, очевидно, нужно будет их устранить.

1
ответ дан 28 November 2019 в 04:56
поделиться

Поскольку вы используете GL, я предполагаю, что вы знаете, что делаете, и пропустите все предостережения. Попробуйте это или посмотрите https://stackoverflow.com/a/35588774/194921

  [StructLayout(LayoutKind.Explicit)]
  public struct ConvertHelper<TFrom, TTo>
      where TFrom : class
      where TTo : class {
    [FieldOffset( 0)] public long before;
    [FieldOffset( 8)] public TFrom input;
    [FieldOffset(16)] public TTo output;

    static public TTo Convert(TFrom thing) {
      var helper = new ConvertHelper<TFrom, TTo> { input = thing };
      unsafe {
        long* dangerous = &helper.before;
        dangerous[2] = dangerous[1];  // ie, output = input
      }
      var ret = helper.output;
      helper.input = null;
      helper.output = null;
      return ret;
    }
  }

  class PublicList<T> {
    public T[] _items;
  }

  public static T[] GetBackingArray<T>(this List<T> list) {
    return ConvertHelper<List<T>, PublicList<T>>.Convert(list)._items;
  }
0
ответ дан 28 November 2019 в 04:56
поделиться
Другие вопросы по тегам:

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