Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 38

Автогенерация массивов

21.06.2023, 14:20. Показов 2070. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим в ходе вычислений я заполняю массив результатами. В 99 случаях это 1 результат на 1 ячейку. Но если результат попадает на уже занятую ячейку, возникает необходимость ещё в одном аналогичном массиве, в теории до нескольких тысяч. Глупо сразу генерировать тысячи массивов, которые наверняка не будут использованы. Можно удваивать и т.д. существующий массив и плюсовать индекс обращения к нему, но, насколько я знаю, при изменении размера массива- создаётся новый массив, а данные копируются- впустую расходуются ресурсы.
Существует ли способ автогенерации массивов по мере необходимости? Ну и соответственно их автоименования.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2023, 14:20
Ответы с готовыми решениями:

Автогенерация форм для ввода данных в БД
Здравствуйте! Подскажите, плз, нужно создать кучу похожих формочек для заполнения словарей БД. Возможно ли создать базовую форму, например...

Автогенерация представления в зависимости от того, какие попадают в Action
В общем такими вещами никогда не занимался и понять не могу как это делать, поэтому если вопрос будет не понятен переспрашивайте потому что...

Автогенерация DataGrid + ручная вставка, как управлять порядком следования колонок
Есть DataGrid AutoGenerateColumns="True" привязанный к коллекции порядок следования задан через атрибут Display(Order=n), в том же гриде...

35
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 38
22.06.2023, 22:38  [ТС]
Студворк — интернет-сервис помощи студентам
Wolfdp,
Для меня самого загадка, почему после стольких объяснений, никто так и не понял, что мне нужно. ChatGPT по одной фразе, выдал мне сразу то что нужно и в первом и во втором случае. Правильный совет был в самом начале- List<T>. Но List<T> мне не подходит, потому что это аналогия динамического массива, - это медленный способ, как говорят програмисты- наивный метод. А вот напрямую работать с выделенной памятью- это то, что нужно, ну понятно, что со всеми вытекающими. А задача в том, что во время работы программы, она сама создавала массивы, один или тысячу, сколько посчитает нужным.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2892
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
23.06.2023, 00:04
Цитата Сообщение от IhKa Посмотреть сообщение
Для меня самого загадка, почему после стольких объяснений, никто так и не понял, что мне нужно.
Все поняли что вам нужно и дали вам ответ. А вот вы не понимаете полученных ответов.
То что вам ответил ChatGPT - это по сути метод Array.Resize. И по скорости он будет такой же. А может и медленее.

Цитата Сообщение от IhKa Посмотреть сообщение
А задача в том, что во время работы программы, она сама создавала массивы, один или тысячу, сколько посчитает нужным.
А вот для этого и создан лист, чтобы не самому писать код который уже "милльон лет назад" написан и отлажен. И, как бы вы не извращались, быстрее вы не получите.

Цитата Сообщение от IhKa Посмотреть сообщение
Но List<T> мне не подходит, потому что это аналогия динамического массива, - это медленный способ, как говорят програмисты- наивный метод.
Одно из двух. Или слушаете не тех "программистов", или они говорят в каком-то особенном контексте где неизмеримая наносекундная разница имеет значение. ПРАКТИЧЕСКИХ задач где это имеет значение, возможно, даже и не существует,
И в любом случае, ничего быстрее Array и List вы не придумаете.

А ChatGPT оставьте на случай, когда понадобится "бред сумасшедшего".

Добавлено через 7 минут
Цитата Сообщение от IhKa Посмотреть сообщение
C#
13
IntPtr memory = Marshal.AllocHGlobal(totalSize); // Выделение памяти
Это медленная операция. И она точно не быстрее чем new T[].

Цитата Сообщение от IhKa Посмотреть сообщение
C#
17
18
19
20
21
22
        // Использование указателя
        for (int i = 0; i < size; i++)
        {
            pointer[i] = i; // Присваивание значения элементу по указателю
            Console.WriteLine(pointer[i]); // Вывод значения элемента по указателю
        }
Это медленный цикл.
В оболочке Array используется вызов наитивного кода копирующего блок памяти, что гораздо быстрее.

Цитата Сообщение от IhKa Посмотреть сообщение
C#
24
Marshal.FreeHGlobal(memory); // Освобождение памяти
Это ещё один тормоз.
В Шарпе в безопасном коде эту функцию выполняет очень оптимизированный GC.
Есть множество различных тестов доказывающих, что он работает гораздо лучше чем прямое отслеживание и очистка памяти, например, как в плюсах.

Добавлено через 9 минут
Цитата Сообщение от IhKa Посмотреть сообщение
В 99 случаях это 1 результат на 1 ячейку. Но если результат попадает на уже занятую ячейку, возникает необходимость ещё в одном аналогичном массиве,
Так как самая медленная операция это выделение новой памяти (без разницы как оператором new или обращением к ОС), то для таких задач обычно стараются как-то минимизировать создание новых массивов.
Но реализации такой оптимизации очень различны. Всё зависит от условий ТЗ, статистического анализа данных и др.
Например, если заполняемость массива данными не высокая (иначе вы не получили бы значение 99%), то можно использовать HashTable через оболочку Dictionary.
Есть множество других способов оптимизации.

Но нужно нормальное описание РЕШАЕМОЙ ЗАДАЧИ, а не того КАК вы ХОТИТЕ её решить.
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
23.06.2023, 04:26
Цитата Сообщение от IhKa Посмотреть сообщение
Для меня самого загадка, почему после стольких объяснений, никто так и не понял, что мне нужно
Наверное стоит выключить режим партизана, и таки начать объяснять зачем вам эти масивы. Смотрим ваше постановление задачи

Цитата Сообщение от IhKa Посмотреть сообщение
Допустим в ходе вычислений я заполняю массив результатами. В 99 случаях это 1 результат на 1 ячейку. Но если результат попадает на уже занятую ячейку, возникает необходимость ещё в одном аналогичном массиве, в теории до нескольких тысяч.
Вот как это понимать? Есть массив
[1, 2, 3, 4]

мы пытаемся в индекс 1 записать значение 9, но там уже не ноль нам нужно создать новый? Типа такого?

[1, 2, 3, 4]
[1, 9, 3, 4]

И при этом вам нужны оба массива? Почему не подходит тупо List<int[]> ?

Задача не в этом? Или вам не нравится что значения 1 3 4 дублируются? Или вы думаете что у меня завалялся волшебный гадальный шар, который может ответить на все эти вопросы?
0
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 38
23.06.2023, 05:32  [ТС]
Ребята, не требуйте от меня профессиональных ответов, иначе б я не задавал непрофессиональных вопросов. Я редкий програмист C#, на практике я программирую микроконтроллеры на С. Ну а С это- "Что хочу, то и делаю", по сравнению с C#, который- "А ты руки мыл?", "А ты их вытер?". Может поэтому я изьяснясь не совсем прозрачно.
Мои оценки скорости выполнения основаны на статьях, где люди проводили реальные замеры, некоторые из них древние, возможно устарели. В любом случае, я пока не смогу всё проверить. Всем большое спасибо.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
23.06.2023, 08:24
IhKa, без обид, но спрашивали вас не знание кода C#, а какую задачу вы поставили перед собой. Как-то люди заказующие софт и не знающие программирование от слова "совсем" справляются с этим, а у вас внезапно режим Штирлица на допросе.

Сравнивать или проводить аналогии с Си или даже С++ не рекомендую, так как C# чуть более высокоуровневый и некоторые вещи отданы на откуп CLR (тоже управление памятью). Адрессная арифметика тут больше как исключение, нежели обыденная практика, с указателями аля int* работают не то чтобы часто. Массивы, строки и многие другие вещи уже достаточно оптимизированы, чтобы не заморачиватся с тем "а хватит ли мне памяти". В новых версиях также ввели кучу улучшений, взять тот же Span. Ну и думаю половина людей кодящих на C# в первую очередь озадачиваются оптимизацией sql-запроса, как бы иронично это не звучало.

По поводу того что "List медленный" очень важно понимать как он используется. Например зная что количество элементов явно будет выше 1_000_000, можно сразу задать размер стартовый размер в один лям, чтобы не дробилось в последствии.

Цитата Сообщение от IhKa Посмотреть сообщение
Мои оценки скорости выполнения основаны на статьях, где люди проводили реальные замеры
Не лишним было бы глянуть ревью этих статей. Натыкался на разобр одной из, где сравнивали C# и node.js. При проверке, оказалось что компилятор node.js выкинул нагрузочный цикл, так как его результат нигде не использовался. Ну либо можно глянуть разбор этой попытки в сравнение C# vs C - Big performance difference Как по мне, фраза no more has a speed than English does довольно хорошо характеризует всё это безобразие.
0
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 38
23.06.2023, 08:44  [ТС]
Wolfdp,
Моё решение о задаче было изменено ещё в 10 посте, но кто их читает )
За стремление помочь, действительно большое спасибо, и за ссылки отдельно.
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,580
23.06.2023, 09:26
Цитата Сообщение от IhKa Посмотреть сообщение
Моё решение о задаче было изменено ещё в 10 посте, но кто их читает )
Читают и переспрашивают. Так как ни в одном из ваших постов именно задачи, которую вы пытаетесь решить, вы так и не обозначили. Сферическое управление какими-то массивами, в которых то блокном со страницами, то видео 4К - это не задача. Вот если бы вы обозначили хотя бы как "менеджер памяти" - это как-то ещё можно было принять за задачу. Но ответ остался бы тем же: управление памятью уже давно решено в C#, и самостоятельно тут ничего придумывать не надо. Пользуйтесь готовыми решениями, концентрируясь на более важных вещах.

Добавлено через 4 минуты
Цитата Сообщение от IhKa Посмотреть сообщение
А задача в том, что во время работы программы, она сама создавала массивы, один или тысячу, сколько посчитает нужным.
Это для пользователя программы она что-то делает "сама". С точки зрения программиста, это он сам создаёт массивы в нужном количестве и следит за правильностью их использования. Ваша программа ничего не сделает "сама", если вы того в неё не вложите.
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2892
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
23.06.2023, 10:24
Цитата Сообщение от IhKa Посмотреть сообщение
Моё решение о задаче было изменено ещё в 10 посте, но кто их читает )
Читают. Создание массива максимально возможного (по условиям ТЗ) размера и потом его заполнение - это самое оптимальное решение с точки зрения оптимизации по скорости. Но, конечно, с ограничением - размер ОЗУ должен позволять безболезненное такое выделение.

Но там же в посте, вы написали само решение, всё же хотелось бы знать. Может кто поопытнее напишет.
Вот у вас и интересуются "решение" чего, какой задачи?

Цитата Сообщение от IhKa Посмотреть сообщение
Я редкий програмист C#, на практике я программирую микроконтроллеры на С. Ну а С это- "Что хочу, то и делаю", по сравнению с C#, который- "А ты руки мыл?", "А ты их вытер?". Может поэтому я изьяснясь не совсем прозрачно.
Возможно.
На Си используется низкоуровневое (сравнительно) управление памятью. Шарп - совсем иная история. Он не компилируется в наитивный код и большая часть взаимодействия с ОС отдана на откуп CLR. И CLR делает это ОЧЕНЬ эффективно независимо от платформы (теоретически Шарп приложение может без перекомпиляции запускаться на любом устройстве). Пытаться заменить "ручным" кодом логику типов .Net и CLR - чаще всего "гиблое дело".

Другое дело, что под определённую задачу надо выбирать наиболее подходящие типы (в данном случае коллекции) и приемы работы с ними. Поэтому у вас и интересуются конкретными условиями ТЗ задачи, а не того как вы хотите её решить.

Добавлено через 8 минут
Цитата Сообщение от IhKa Посмотреть сообщение
Мои оценки скорости выполнения основаны на статьях, где люди проводили реальные замеры, некоторые из них древние, возможно устарели.
Что такое "реальный замер".

Пример.
Есть инт массив и список. В них просто записывают одно и тоже число миллион раз. И читают его. Если список не был сразу инициализирован нужным размером, то конечно, запись в него будет много медленнее, так как будут запросы на выделение памяти при увеличении его размера.

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

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

Добавлено через 39 секунд
И какой из этих трёх тестов можно назвать "реальным замером"?
0
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 38
23.06.2023, 13:20  [ТС]
Wolfdp,
Я понял, вы хотите знать, что я вообще ваяю. Да это чисто для себя, хочу редактировать файлы vmd для программы MMD. Но пока даже алгоритма толком нет, одни идеи. Типа чтоб файлы движений подстраивались под 3D модель автоматически.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2892
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
23.06.2023, 13:35
Цитата Сообщение от IhKa Посмотреть сообщение
Типа чтоб файлы движений подстраивались под 3D модель автоматически.
Ох, чую, что здесь загвоздка будет далеко не в оптимальной работе с массивами...
0
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 38
23.06.2023, 14:38  [ТС]
Элд Хасп,
Ну две програмки уже сделаны и работают с этими файлами. Ну и да работа с массивами, это лишь винтик в машине.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2892
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
23.06.2023, 14:53
Цитата Сообщение от IhKa Посмотреть сообщение
Ну и да работа с массивами, это лишь винтик в машине.
Фраза из анекдота: "Это как экономия 1 доллара при покупке мерседеса...".
1
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 38
23.06.2023, 16:32  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Фраза из анекдота: "Это как экономия 1 доллара при покупке мерседеса...".
Если мерседес стоит два доллара, то это существенная экономия )
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2892
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
23.06.2023, 16:37
Цитата Сообщение от IhKa Посмотреть сообщение
Если мерседес стоит два доллара, то это существенная экономия )
В вашем случае (аналогии затратности исполнения вашего алгоритма) он стоит как Майбах 100к+.
0
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 38
23.06.2023, 17:14  [ТС]
Элд Хасп,
Я вас прекрасно понял, но останусь при своём мнении. Это не имеет значения, поскольку у меня будут на вооружении два новых отработаных метода работы с массивами. И я смогу применять их хоть там, где они ничего не дадут, хоть там, где без них ничего не выйдет.
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,580
23.06.2023, 22:30
IhKa, когда рутина немного наскучит, почитайте про Golden Hammer.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.06.2023, 22:30

Пользователь вводит длину массивов. Заполнение массивов случайными числами
Помогите доработать задачу В путем отсеивание из задачи А задачу Б (Язык С#) Пользователь вводит длину массивов. Заполнение массивов...

Склейка массивов: реализуйте метод Combine, который возвращает массив, собранный из переданных массивов
Склейка массивов Реализуйте метод Combine, который возвращает массив, собранный из переданных массивов. Для того, чтобы создать...

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

нахождение уникальных массивов в массиве массивов
Как бы не звучал вопрос по идиотски, но уже целый день тружусь над человеческим решением проблемы, есть массив из 100000 массивов ,...

Java автогенерация ID
Доброго времени суток. Я бы хотел узнать как можно сделать автоматическую генерацию ID? Чтобы записи автоматически номеровались. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru