Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > Общие вопросы Web
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2016, 20:56   #101
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

итого, я просто написал один метод аналогичный вашему.
и скорость та же.(даже на пару тиков быстрее)
ну а Linq я по приколу протестировал

TestSL это ваш класс.
TestOwn стандартный + мой метод доступа по индексу.

ко всем спискам идет обращение к одинаковым индексам.
так что тут разницы нет.

Цитата:
А изменяете код как? (добавление фич, исправление багов)
а там кстати нельзя так просто заменить string на double, весь return null сфейлится.
так что мы пришли к тому что таки лишняя работа?
Цитата:
И что у вас там такого узконаправленного, что generic'и (для своих коллекций) не подошли?
да он просто думает что генерики имеют оверхед.

Код:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
    class StringList
    {
        public StringList(string newitem)
        {
            item = newitem;
        }
        public string item;
        public StringList
            first, // первый элемент
            next; // следующий элемент
        public int position;

        public void Add(string newitem)
        {
            StringList link = first;
            while (first.next != null)
                first = first.next;
            link.next = new StringList(newitem);
            link.next.first = first;
            link.next.position = link.position + 1;
        }

        // ... методы добавления

        public string ItemFromIndex(int index)
        {
            try
            {
                StringList link = first;
                while (link.position < index)
                    link = link.next;
                return link.item;
            }
            catch
            {
                return null;
            }
        }

        // методы удаления
    }
    public static class LinkedListExtension
    {
        public static T At<T>(this LinkedList<T> data, int index)
        {
            try
            {
                var node = data.First;
                while (index > 0)
                {
                    node = node.Next;
                    index--;
                }
                return node.Value;
            }
            catch
            {
                return default(T);
            }
        }
    }
    class Program
    {
        const int Count= 5000;
        const int IterationAmount = 100;

        static int[] Indexes = new int[Count];
        static void Main(string[] args)
        {
            var rnd = new Random();
            for (int i = 0; i < Count; i++)
                Indexes[i] = rnd.Next(Count);
            RunTest(nameof(TestOwn), PrepareLinkedList, TestOwn);
            RunTest(nameof(TestSL), PrepareStringList, TestSL);
        }

        static StringList PrepareStringList(int count)
        {
            var res = new StringList(count+"");
            res.first = res;
            for (int i = (count-1); i > 0; i--)
                res.Add(i+"");
            return res;
        }
        static void TestSL(StringList data)
        {
            foreach (var t in Indexes)
            {
                var element = data.ItemFromIndex(t);
            }
        }
        static LinkedList<string> PrepareLinkedList(int count)
        {
            var res = new LinkedList<string>();
            for (int i = count; i > 0; i--)
                res.AddLast(i + "");
            return res;
        }
        static void TestOwn(LinkedList<string> data)
        {
            foreach (var t in Indexes)
            {
                var element = data.At(t);
            }
        }

        static void RunTest<T>(string name, Func<int,T> prepareData, Action<T> Testee)
        {
            try
            {
                T data = prepareData(Count);
                for (int i = 0; i < 3; i++)
                    Testee(data);
                var timer = new Stopwatch();
                timer.Start();
                for (int i = 0; i < IterationAmount; i++)
                    Testee(data);
                timer.Stop();
                Console.WriteLine("{0}: {1} : {2} : {3}", name, timer.Elapsed, ((double)timer.ElapsedMilliseconds) / IterationAmount, timer.ElapsedTicks / IterationAmount);
            }
            catch(Exception e)
            {
                Console.WriteLine("{0}: Fail : {1}", name, e.GetType().Name);
            }
            finally
            {
                GC.Collect();
            }
        }
    }
}
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 11.09.2016 в 21:25.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.09.2016, 21:06   #102
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Alex11223
Программа notepad++ позволяет выполнять функцию "Заменить всё". Определяю характер бага, исправляю в одном файле, в остальных выполняю замену по такому же принципу. Добавление фич, как уже было сказано - конкретное требование, встречается довольно редко, и повторений ещё не было. Поэтому "добавление фишки для конкретной задачи" - дело пяти минут.
Пепел Феникса
Не знаю, как вы считали, мои результаты двухлетней давности показывают примерно 1.5 ускорение. И это я ещё не улучшал логику работы. Раньше писал, как можно улучшить: закольцовка, плюс несколько полей, и переработка "случайного доступа". И не то, что бы времени не жалко - потрачу свободное время, и получу удовольствие от работы, которая в дальнейшем принесёт оптимизацию.
Что касается типов, не позволяющих хранить null - возвращается ошибка, естесно в формате исключения. Поэтому весь return null меняется на throw.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 11.09.2016, 21:09   #103
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

так стоп..

все хуже.
Цитата:
TestOwn: 00:00:03.3470370 : 33,47 : 78268
TestSL: Fail : NullReferenceException
поправил инициализацию списка.(first не иницилизировалось)
результат еще хуже.
Цитата:
TestOwn: 00:00:03.3029785 : 33,02 : 77238
TestSL: 00:00:09.4575767 : 94,57 : 221159
Цитата:
Не знаю, как вы считали, мои результаты двухлетней давности показывают примерно 1.5 ускорение.
код теста ниже.
там убрано все возможное влияние на результаты.(+ запуск под релизом и вне отладки)
в том числе и влияние JIT'а.

параметры тестов, 5000 элементов(они одинаковы для обоих списков) + 100 итераций.
номера элементов для доступа одинаковые у всех тестов.

если же вы делали лишь прямое применение, без прогона циклами, то вы измерили скорость JIT'а, а не класса
Цитата:
Программа notepad++ позволяет выполнять функцию "Заменить всё".
а что в студии нельзя этого сделать? О_о

итог тестов:
1)ваш класс можно применять только для строк.
2)скорость хуже.
3)нужно переписывание под каждый тип.
4)нет поддержки стандартных интерфейсов, итого многий код для вашего класса нужен с нуля(например сложить все строки в одну большую, с разделителем или без)

выгоды ноль.
надеюсь не будет попыток биться с наглядным результатом.

код я перевыложил, в 101 посту.
тест проверяет только рандомный доступ.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 11.09.2016 в 22:03.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.09.2016, 21:35   #104
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
да он просто думает что генерики имеют оверхед.
Да, я на это и намекал
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.09.2016, 21:42   #105
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
Что же, вы меня убедили в том, что нужно повторно тестировать собственные классы. У меня всё работало, и работало быстрее встроенных классов. И в придачу буду оптимизировать - улучшать логику.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 11.09.2016, 21:47   #106
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если вы не сделали правильную оценку(а оценивать дотнет сложнее чем просто С++), то можете даже не пытаться тестировать.

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

как я говорил вы со своим классом отказались от многого.
например как насчет соединения всех строк из вашего списка в одну?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.09.2016, 21:56   #107
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
Я делал правильную оценку - независимую, с применением рандома, причём без предварительного сохранения оного, а на лету ... Для обоих коллекций. Мало того, я проводил три одинаковых теста, так как я уже знал о наличии JIT. Етстесно, результат первого был чуть хуже.
Ваш пример (соединение строк в одну) - задача тривиальная, и сделать можно, как говорил - за пять минут. И я ещё не встречал такую необходимость. Покажите конкретный пример.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 11.09.2016, 21:59   #108
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Я делал правильную оценку - независимую, с применением рандома, причём без предварительного сохранения оного, а на лету ...
если были обращения к рандомному элементу, тот тут ошибка, ваш класс мог попасть на 6-ый, а стандартный на 25. итого не справедливость.
именно для этого я сохраняю массив индексов, что разница есть только в реализациях тестируемого.
Цитата:
Ваш пример (соединение строк в одну) - задача тривиальная, и сделать можно, как говорил - за пять минут. И я ещё не встречал такую необходимость. Покажите конкретный пример.
задача тривиальная, да, но вот как вы решать ее будете с вашим классом?
как я решать буду, я знаю

я показал как тестировал, ваш код показал худший результат, и код максимально независим от всех условий в принципе.
(+ остальные пункты 103 поста тоже актуальны)

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

иногда велосипеды полезны, но не всегда.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 11.09.2016 в 22:09.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.09.2016, 22:13   #109
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
Код:
public string GetJoinString()
{
	StringList link=first;
	string result="";
	while (link!=null)
	{
		result+=link.item; // тут можно впихнуть любой разделитель, в т. ч. передаваемый через параметр функции
		link=link.next;
	}
	return result;
}
Это как внутренний метод класса. Внешний можно ляпнуть по другому
Код:
StringList mylist=new StringList("lol");
mylist.first=mylist;
// ... тут что нибудь делаем с этой спискотой
string combine="";
mylist=mylist.first;
while (mylist.next!=null)
{
	combine+=mylist.item; // опять же - любой разделитель
	mylist=mylist.next;
}
combine+=mylist.item; // что бы последний сохранился; можно переписать под цикл do {} while, но это уже другая история
Что касается индексов из рандома - я имел ввиду, что не сохранял их в массив перед тестированием. А каждый раз сохранял в одну переменную, которую использовал для доступа, и в начале итерации всё по новой.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 11.09.2016, 22:17   #110
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Это как внутренний метод класса. Внешний можно ляпнуть по другому
поздравляю, вы выкинули эффективный string.Join для своей не эффективной поделки.
суть в том что ваш код, создает кучу объектов во время работы и так же выделяет память на каждой итерации.(ну и как следствие отработает медленнее)
как раз то о чем я говорил, так что думайте дальше, стоит ли продолжать выкидывать генофонд.
Цитата:
Что касается индексов из рандома - я имел ввиду, что не сохранял их в массив перед тестированием. А каждый раз сохранял в одну переменную, которую использовал для доступа, и в начале итерации всё по новой.
индексы должны быть одинаковы на оба списка, оба должны быть инициализированны одними и теми же данными.
как вы сохранили кучу индексов не в массив, тоже интересно
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Небольшое веб-приложение на ASP.NET aly-lucenko Фриланс 10 10.01.2014 23:31
Веб-приложение asp.net MVC и с чем его едят nec117 ASP.NET 0 18.04.2011 17:04