none
Как присваивать значение в область памяти RRS feed

  • Вопрос

  • Есть область памяти. int[] array=new int [number];. Существуетли способ присваиват значение динамично в эту область памяти без исползованием итераторы, что бы в итоге каждый элемент массива было равно на int value; Нужно мне это для ускорение процесс инициализации. То есть место number количество операции исползовать только один.
    18 октября 2012 г. 5:32

Ответы

  • Коллега, не занимайтесь преждевременной оптимизацией.

    Напишите вот такой метод:

    public static void Initialize<T>(T[] array, T value)
    {
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = value;
        }
    }
    static void Main(string[] args)
    {
        int[] a = new int[10];
        Initialize(a, 10);
        foreach (var item in a)
        {
            Console.WriteLine(item);
        }
        Console.ReadKey();
    }

    А вот если у вас на инициализация потом начнется затык (не по вашим ощущениям, а по данным профилера), то тогда и перепишите этот единственный метод.

    • Помечено в качестве ответа Abolmasov Dmitry 25 октября 2012 г. 9:00
    18 октября 2012 г. 7:08
    Отвечающий

Все ответы

  • Добрый день.

    Судя по приведенному фрагменту кода, вы используете C#. Ну а раз так, то про прямую работу с памятью из управляемого кода можете забыть. Нужно быстро и просто работать с памятью? Тогда C++. Нужна высокая скорость разработки с очень высоким контролем ошибок? Тогда C#, но вот с памятью на прямую не поработаете...

    18 октября 2012 г. 5:55
    Отвечающий
  • Быстрее только на асемблере, так что заниматься этим на  C# шаманство. Если нужна скорость, критически важные куски кода пишут на ассемблере. Если уж так нужно, используйте ассемблер, а потом используйте PInvoke. Только это очень непросто. Только для конкретного случая, вам никакой необходимости нет, всё и так очень быстро работает.
    18 октября 2012 г. 6:17
    Модератор
  • А вы не знаете какой нибуть API для решения подобных проблем?

    18 октября 2012 г. 6:30
  • может не к месту,

    но помнится было что-то вроде memset.
    это использовалось чтобы массив обнулить (на случай если при создании там не нули в памяти).
    Но это наврядли как-то что-то сильно ускорит.

    Понятно, что это для массива байт.
    Но в массив целых чисел через указатели можно как-то пределать хотя бы для доступа потом по элементам.

    • Изменено INFEL8 18 октября 2012 г. 6:39
    18 октября 2012 г. 6:36
  • Спасибо ребята.

    Я уверен что должно быт стандартный API. И мне надо ни только для целых, а на все скалярных типов.

    float[] array=new float[number];

    double[] array=new double[number];

    int[] array=new int[number];

    byte[] array=new byte[number];

    ...

    Инициализатор-функция примерно

    float[] Initialize( array, float value)

    double[] Initialize( array, double value)

    int[] Initialize( array, int value)

    byte[] Initialize( array, byte value)

    18 октября 2012 г. 6:51
  • Коллега, не занимайтесь преждевременной оптимизацией.

    Напишите вот такой метод:

    public static void Initialize<T>(T[] array, T value)
    {
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = value;
        }
    }
    static void Main(string[] args)
    {
        int[] a = new int[10];
        Initialize(a, 10);
        foreach (var item in a)
        {
            Console.WriteLine(item);
        }
        Console.ReadKey();
    }

    А вот если у вас на инициализация потом начнется затык (не по вашим ощущениям, а по данным профилера), то тогда и перепишите этот единственный метод.

    • Помечено в качестве ответа Abolmasov Dmitry 25 октября 2012 г. 9:00
    18 октября 2012 г. 7:08
    Отвечающий
  • "Коллега, не занимайтесь преждевременной оптимизацией." - вот именно.
    18 октября 2012 г. 7:34
    Модератор
  • Ну я почувствовал нужду на это, и поэтому поднимаю вопрос. Нужно эффективность. Показанный выше код я уже много раз испытал. Много раз испытал. Сейчас уже негодится. Практика показывает что надо как можно болше избегать от вложенных циклах.

    18 октября 2012 г. 7:47
  • Коллега, а где вы видите вложенные циклы в моем примере? Там вложенных циклов то как раз и нет.

    Теперь по поводу оптимизации. Не выложите скриншот с HotPath чтобы посмотреть, на чем у вас реально падает производительность.

    18 октября 2012 г. 7:54
    Отвечающий
  • Привет.

    А на сколько большие у вас массивы раз вы хотите ускорить их заполнение?

    Посмотрите статью Filling an array with a default value, там рассматриваются различные варианты заполнения массива и приводятся результаты тестов. В том числе и unsafe.


    Для связи [mail]

    19 октября 2012 г. 11:59