|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
12.09.2016, 23:27 | #131 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Пепел Феникса
Как я понял, у этого вашего LinkedList нет собственной индексации, отсюда и костыли вроде "LinkListExtension". В моём классе эта функция включается по умолчанию. В MSDN нашёл нечто вроде ElementAt, но в объекте класса LinkedList этот метод не определён. И, это я ещё не лез в исходники дотнета, которые я скачал недавно. К тому же ваша конструкция исключает возможность НЕ сохранять последовательность случайных индексов для доступа, о чём я уже упоминал. Мой улучшенный метод (который я назвал карусельным) позволяет вытаскивать элементы по индексу чуть более чем в три раза быстрее (порядка 3,25), чем стандартный метод. Скорость создания колеблется в пределах +/-5% для обоих коллекций. Вы говорили, что двусвязный закольцованный список мне не поможет ... Далее будут листинги. Код переработанного моего класса Код:
Код:
Подпись ? Не, не слышал ...
|
12.09.2016, 23:27 | #132 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Если коэффициент больше единицы - то это означает, что мой класс в этой части лучше стандартного.
К тому же, я так понимаю, что внутри List<T> спрятан обычный массив ссылок на объекты *. Потому что иначе я никак не объясню скорость ответа, примерно равную скорости вызова функции. И для убеждения в том, что и там есть что ускорить - я как нибудь залезу в исходник, посмотрю, как оно там устроено. Что касается спора о том, как тестировать - я не буду возражать против того, что точетные замеры будут давать большие погрешности, во всяком случае не собираюсь проверять. И так сойдёт. Не сохранять перечень псевдослучайных индексов можно, при чём для любого режима тестирования. Ключевой момент - псевдо: если конструктору рандома скармливать какое нибудь число - то в любой точке пространства/времени вы получите одинаковый набор чисел, ибо так он (рандом) устроен. Теперь о звёздочке (*): по большому счёту, в объектах можно хранить произвольный набор данных, а в массиве хранить ссылки на эти объекты. Тогда линейно в памяти мы будем хранить только те самые ссылки (размер которых толи 4, то ли 8 байт), а сами объекты будут расположены где придётся.
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 12.09.2016 в 23:31. |
13.09.2016, 00:19 | #133 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Пепел Феникса
И ещё, как я понял, ваш метод улучшенного поиска заключается в том, что вы перед переходом в начало списка проверяете, что требуемый индекс может находится дальше чем текущий, и переход в начало становится нецелесобразным, потому что создаст необходимость заново проходить все элементы до того, с которого вы начали. Это слишком просто.
Подпись ? Не, не слышал ...
|
13.09.2016, 00:33 | #134 | |||||||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
это не обязательно, это делается для чистоты проверки, когда обращение идет к одинаковым элементам. на одинаковом наборе данных, только тогда мы получаем измерения зависящее от кода, а не от рандома.(вашему классу может повезти на удачные обращения например) ваш тест должен показывать один и тот же коэффициент от запуска к запуску, иначе он неверен. Цитата:
раз 5 это говорил. но вы вообще-то тестировали LinkedList. Цитата:
Цитата:
а это совсем иное. Цитата:
а это называется метод расширения, снова пробел? (иной вариант был бы применить наследование) Цитата:
снова пробел. и да, я не думаю что это сильно удивительно что связанный список не имеет доступа по индексу, он не создан для этого результаты честного теста.(вы решили проигнорировать мои разъяснения на этот счет) Цитата:
Цитата:
Цитата:
хотя есть ситуации где ваш код мог бы выиграть, но в чисто рандомном доступе он проигрывает. TestOwn2 отличается от TestOwn тем что выполняет двунаправленный поиск.(либо с конца, либо с начала, а не только с начала как TestOwn) как вы можете заметить я вас еще и специально ввел в этот тест.(кстати остальные аргументы против вашего подхода вы тоже проигнорировали) я ведь не спроста говорил про string.Join что не доступен вашему классу.(и многое иное, например распараллеливание обработки готовое, вам тоже не доступно, а значит снова будете писать свое...) для задачи где нужно оптимальное применение памяти и максимальная скорость доступа, я бы написал некий Partioned storage(сочетание списка и массива) так что думайте, стоит ли продолжать тратить свое время.* за сим, удачи вам советую вернутся к топику темы все же. * - если сравнить время потраченное, результат будет еще хуже. я потратил пару минут на расширение класса, ваш же класс был написан с нуля. + мне не придется переделывать класс для LinkedList<int>, вам, придется. я надеюсь вы все же перестанете заниматься лишней работой(ну или жизнь заставит, когда на работу пойдете, как тот из-за кого уволили пару человек, я могу так говорить) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 13.09.2016 в 00:40. |
|||||||||
13.09.2016, 01:23 | #135 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Пепел Феникса
Я уже не один раз говорил, что мои обращения всегда одинаковы, с одним лишь отличием от ваших - я не создаю массив, а испоьзую способность ГПСЧ выдавать одинаковые последовательности. Моя карусель так же выполняет двунаправленный переход (стоит заметить, что это не поиск), только не с начала / с конца, а от последней позиции, что максимально приближается к условиям случайности. Я трачу на это время лишь потому что мне это интересно. Что касается того, что ссылочный список не создан для индексации - я придумал, как избавиться от проблем при удалении элемнтов: опять же, не таскать индекс за каждым элементом, а пересчитывать его по мере перемещения по списку. В моём коде, кстати, не будет перемещения по списку в том случае, если в обоих направлениях будет одинаковое количество переходов - для случаев, когда количество элементов нечётное. Тут не хватает одного символа равно. На счёт тестов: скажите на основе конкретного кода - что я не учитываю ?
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 13.09.2016 в 01:43. |
13.09.2016, 01:46 | #136 | ||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Цитата:
только не надо утверждать что у меня массив нужен, он не нужен. я рандом и тут вынес вне измерений, вот и все Цитата:
2)У вас нет сглаживания погрешностей.(тики кстати говоря, это не тики инструкций, а тики системного таймера, что совсем разное) 3)нет учета сборщика мусора и потребления памяти. Цитата:
посмотрел это место, вы зачем делаете два сравнения? вы не в курсе что Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 13.09.2016 в 01:56. |
||||
13.09.2016, 01:59 | #137 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Пепел Феникса
Два сравнения делаю для того, что бы не считать лишний раз количество переходов, собсна поэтому и прозевал равное их кол-во для нечётного кол-ва элементов. Скриншот не из отладки, и вне дебага (что кстати одно и тоже на разных языках) ... Просто запуск экзешника из папки проекта. Что за сглаживание погрешностей ? Я перед заходом в цикл стартую таймер, а после выхода отключаю этот же таймер; потом только снимаю результаты. Насколько мне известно - тики из stopwatch - это как раз таки параметры тактового генератора процессора. А точность системного таймера находится на уровне 20 миллисекунд (поэтому таймер из форм лучше не использовать для точных вычислений) Upd Про память и сборщик мусора не понял ... Я нигде не освобождаю память, что бы работал сборщик, а выделение памяти равнозначно для обоих коллекций.
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 13.09.2016 в 02:07. |
13.09.2016, 02:08 | #138 | |||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
какой таймер применяется показывает свойство класса Stopwatch. (уж явно не такты процессора) Цитата:
Цитата:
Debug - это конфигурация построения. отладка - это собственно отладка. тут нет разных языков. Цитата:
вы языки часом не путаете? в шарпе нет явного освобождения памяти, максимум удаление ссылки. Цитата:
и повторю раз пятый, просто пытаюсь вас предостеречь от собственных ошибок. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 13.09.2016 в 02:11. |
|||||
13.09.2016, 02:25 | #139 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Пепел Феникса
И чем же отличается конфигурация сборки дебаг от релиза ? При условии, что я запускаю екзешник из папки, а не (Ctrl+)F5 в студии. В пределах кода во время замера область видимости не изменяется. Таймер сделан глобальным лишь для удобства. Если говорить об области видимости внутри кода коллекций - то у каждого класса свои переменные, и свои внутренние данные - и сводить обработку этих данных к погрешности ни в коем случае нельзя. Ибо если в LinkedList есть локальная переменная temp (скажем в функции AddLast), то на её создание и удаление так же будет затрачено время, которое так же необходимо учитывать. Тоже самое справедливо и для моего класса. А про два сравнения - у меня не три выхода, а четыре. Именно поэтому важно определить в каком направлении нужно двигаться.
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 13.09.2016 в 02:30. |
13.09.2016, 08:13 | #140 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Отсутствием оптимизаций, наличием ассертов и прочих отладочных вещей.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Небольшое веб-приложение на ASP.NET | aly-lucenko | Фриланс | 10 | 10.01.2014 23:31 |
Веб-приложение asp.net MVC и с чем его едят | nec117 | ASP.NET | 0 | 18.04.2011 17:04 |