-1

Привет, коллеги-программисты. Таким образом, у меня есть структура, и у вас есть 3 разных 3D-массива, чтобы их хранить. Дело в том, что оптимизация не является моей специальностью, и мне нужен совет от кого-то, кто знает их вещи относительно наилучших способов хранения и доступа к многомерным массивам структур , Мне нужно знать, есть ли какой-либо из этих методов с точки зрения использования памяти или скорости доступа и т. Д. По сравнению друг с другом. Есть ли еще лучший способ хранения и доступа к структуре, кроме массивов, о которых я не знаю? В основном я использовал https://msdn.microsoft.com/en-us/library/2s05feca.aspx и другие столбцы переполнения стека для справки.C# лучший способ доступа к 3D-массиву структур

Я знаю, что производительность и использование памяти, вероятно, незначительны, когда дело доходит до небольших наборов данных, но причина, по которой я публикую здесь, состоит в том, что я знаю, что в конечном итоге любой метод, который я выбираю, будет использоваться для очень больших наборов данных, и я хочу избежать потенциальной проблемы в будущем.

В настоящее время я планирую использовать один из методов для массива 5 на 8 по X. Я инициализировал каждый из методов ниже, чтобы быть 2 на 2 по X, чтобы было легче увидеть, где добавлены элементы.

трех методов заключаются в следующем:

Класс вложенности массив - массив элементов, хранящихся в классе, который является массивом внутри другого класса.

public static Tier3[] _Tier3 = new Tier3[2] 

3D полный зубчатый массив - массив, расширяемый во всех трех измерениях.

public static Item[][][] _3DjaggedItems = new Item[2][][] 

2D прямоугольная матрица - двумерная матрица в 2-х измерениях, хранящая зубчатые массивы.

public static Item[,][] _2Drectangle_3DjaggedItems = new Item[2,2][] 

Если вы знаете, лучший способ хранения и доступа к этой структуре, пожалуйста, имейте в виде, что вы должны быть в состоянии напечатать «Привет, мир!» путем присвоения значений

public ItemSystem.Item _Item; 
public ItemSystem.Item[] _ItemList; 

и вызов PrintTest(); для печати сообщения.

Я сделаю все возможное, чтобы ответить на любые вопросы. Спасибо заранее за любую помощь!

Ниже приведен тестовый код, который я написал, используя все три метода для печати «Hello, world!». Просто скопируйте пасту в компилятор C# для запуска. Я использовал http://rextester.com/

//Rextester.Program.Main is the entry point for your code. Don't change it. 
//Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text.RegularExpressions; 

namespace Rextester 
{ 
public class ItemSystem 
{ 
    public struct Item 
    { 
     public string _1; 
     public string _2; 
     public string _3; 
    } 

    public class Tier2 
    { 
     public Item[] _Items; 
    } 

    public class Tier3 
    { 
     public Tier2[] _Tier2; 
    } 

    //The class of containers the data of which is initialized once. 
    public static Tier3[] _Tier3 = new Tier3[2] 
    { 
     new Tier3() 
     { 
      _Tier2 = new Tier2[2] 
      { 
       new Tier2() 
       { 
        _Items = new ItemSystem.Item[] 
        { 
         new Item() { _1 = "H", _2 = "e", _3 = "l" }, 
         new Item() { _1 = "l", _2 = "o", _3 = "," }, 
         new Item() { _1 = " ", _2 = "w", _3 = "o" }, 
         new Item() { _1 = "r", _2 = "l", _3 = "d" }, 
         new Item() { _1 = "!", _2 = "", _3 = "" } 
        } 
       }, 
       new Tier2() 
       { 
        _Items = new ItemSystem.Item[] 
        { 
         new Item() { _1 = "H", _2 = "e", _3 = "l" } 
        } 
       }, 
      } 
     }, 
     new Tier3() 
     { 
      _Tier2 = new Tier2[2] 
      { 
       new Tier2() 
       { 
        _Items = new ItemSystem.Item[] 
        { 
         new Item() { _1 = "H", _2 = "e", _3 = "l" } 
        } 
       }, 
       new Tier2() 
       { 
        _Items = new ItemSystem.Item[] 
        { 
         new Item() { _1 = "H", _2 = "e", _3 = "l" } 
        } 
       }, 
      } 
     }, 
    }; 

    public static Item[][][] _3DjaggedItems = new Item[2][][] 
    { 
     new Item[2][] 
     { 
      new Item[] 
      { 
       new Item() { _1 = "H", _2 = "e", _3 = "l" }, 
       new Item() { _1 = "l", _2 = "o", _3 = "," }, 
       new Item() { _1 = " ", _2 = "w", _3 = "o" }, 
       new Item() { _1 = "r", _2 = "l", _3 = "d" }, 
       new Item() { _1 = "!", _2 = "", _3 = "" } 
      }, 
      new Item[] 
      { 
       new Item() { _1 = "H", _2 = "e", _3 = "l" } 
      }, 
     }, 
     new Item[2][] 
     { 
      new Item[] 
      { 
       new Item() { _1 = "H", _2 = "e", _3 = "l" } 
      }, 
      new Item[] 
      { 
       new Item() { _1 = "H", _2 = "e", _3 = "l" } 
      }, 
     }, 
    }; 

    public static Item[,][] _2Drectangle_3DjaggedItems = new Item[2,2][] 
    { 
     { 
      new Item[] 
      { 
       new Item() { _1 = "H", _2 = "e", _3 = "l" }, 
       new Item() { _1 = "l", _2 = "o", _3 = "," }, 
       new Item() { _1 = " ", _2 = "w", _3 = "o" }, 
       new Item() { _1 = "r", _2 = "l", _3 = "d" }, 
       new Item() { _1 = "!", _2 = "", _3 = "" } 
      }, 
      new Item[] 
      { 
       new Item() { _1 = "H", _2 = "e", _3 = "l" }, 
      }, 
     }, 
     { 
      new Item[] 
      { 
       new Item() { _1 = "H", _2 = "e", _3 = "l" }, 
      }, 
      new Item[] 
      { 
       new Item() { _1 = "H", _2 = "e", _3 = "l" }, 
      }, 
     }, 
    }; 
} 

public class Program 
{ 
    public ItemSystem.Item _Item; 
    public ItemSystem.Item[] _ItemList; 
    public int _Tier3Accessor = 0; 
    public int _Tier2Accessor = 0; 
    public void TestFunc() 
    { 
     _Item  = ItemSystem._Tier3[_Tier3Accessor]._Tier2[_Tier2Accessor]._Items[0]; 
     _ItemList = ItemSystem._Tier3[_Tier3Accessor]._Tier2[_Tier2Accessor]._Items; 

     PrintTest(); 

     _Item  = ItemSystem._3DjaggedItems[_Tier3Accessor][_Tier2Accessor][0]; 
     _ItemList = ItemSystem._3DjaggedItems[_Tier3Accessor][_Tier2Accessor]; 

     PrintTest(); 

     _Item  = ItemSystem._2Drectangle_3DjaggedItems[_Tier3Accessor, _Tier2Accessor][0]; 
     _ItemList = ItemSystem._2Drectangle_3DjaggedItems[_Tier3Accessor, _Tier2Accessor]; 

     PrintTest(); 
    } 

    public void PrintTest() 
    { 
     for(int i = 0; i < _ItemList.Length; i++) 
     { 
      Console.Write(_ItemList[i]._1); 
      Console.Write(_ItemList[i]._2); 
      Console.Write(_ItemList[i]._3); 
     } 

     Console.WriteLine("\n"); 
    } 

    public static void Main(string[] args) 
    { 
     Program p = new Program(); 
     p.TestFunc(); 
    } 
} 
} 
+0

Можете ли вы переместить это на [codereview] (http://codereview.stackexchange.com/)? Потому что проблема с кодом не исправлена. –

+0

Конечно, я могу разместить его там. Я отправил код, чтобы тот, кто пытается ответить на мои вопросы оптимизации, может точно видеть, что я делаю. –

+0

Всё зависит от меня. Только вы знаете шаблоны доступа: какие размеры идут с каким шагом в каком порядке, доступ более или менее случайный, будут ли данные распределяться между потоками, требующими синхронизации, размерами кэшей на целевой машине, .... – HABO

ответ

0

Понял. Сделал еще несколько поиск, и через некоторое время наткнулся на эти посты

What are the differences between a multidimensional array and an array of arrays in C#?

Why are multi-dimensional arrays in .NET slower than normal arrays?

Короткий ответ, что уплощение массивы, а затем вычисления индекса вы хотите получить доступ самый быстрый путь. Вслед за массивами Jagged, поскольку многомерные массивы имеют медленную реализацию на C#.

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

Смежные вопросы