Какова скорость доступа к членам класса o(...)?
От: Passerby  
Дата: 25.07.19 22:44
Оценка:
Какова скорость доступа к членам класса o(...)? Быстрее, чем у словаря?
Re: Какова скорость доступа к членам класса o(...)?
От: GarryIV  
Дата: 25.07.19 22:56
Оценка:
Здравствуйте, Passerby, Вы писали:

P>Какова скорость доступа к членам класса o(...)? Быстрее, чем у словаря?


Словарь не класс и там нет членов?
WBR, Igor Evgrafov
Re[2]: Какова скорость доступа к членам класса o(...)?
От: Passerby  
Дата: 25.07.19 23:43
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Здравствуйте, Passerby, Вы писали:


P>>Какова скорость доступа к членам класса o(...)? Быстрее, чем у словаря?


GIV>Словарь не класс и там нет членов?

Естественно, имел в виду доступ по ключу.
class A
        {
            public int i = 1;
            public int j = 2;
        }

        public void Optim()
        {
            A a = new A();
            Dictionary<string, int> dct = new Dictionary<string, int>() { { "a", 1 }, { "b", 2 } };

            Stopwatch st1 = new Stopwatch();
            st1.Start();
            for (int i = 0; i < 100000000; i++)
            { a.i++; }
            st1.Stop();
            TimeSpan ts1 = st1.Elapsed;

            Stopwatch st2 = new Stopwatch();
            st2.Start();
            for (int i = 0; i < 100000000; i++)
            { dct["a"]++; }
            st2.Stop();
            TimeSpan ts2 = st2.Elapsed;
        }

У словаря скорость в отладке получается раз в 20 медленнее. Может это из-за VS?
Прога критична к быстродействию. Потому заменил словари массивами. Можно существенно сократить код за счет повторно используемого кода, введя классы, в которые поместить эти массивы. Но тогда не окажется ли быстродействие тем же, что было до замены словарей массивами?
Отредактировано 25.07.2019 23:49 Passerby . Предыдущая версия . Еще …
Отредактировано 25.07.2019 23:47 Passerby . Предыдущая версия .
Re[3]: Какова скорость доступа к членам класса o(...)?
От: Danchik Украина  
Дата: 26.07.19 05:42
Оценка:
Здравствуйте, Passerby, Вы писали:

P>Здравствуйте, GarryIV, Вы писали:


P
P>У словаря скорость в отладке получается раз в 20 медленнее. Может это из-за VS?

Отладка практически всегда медленнее. Так скорость не меряют. И естественно словарь медленнее.

P>Прога критична к быстродействию. Потому заменил словари массивами. Можно существенно сократить код за счет повторно используемого кода, введя классы, в которые поместить эти массивы. Но тогда не окажется ли быстродействие тем же, что было до замены словарей массивами?


Тут какая-то каша с предположениями. Объясните что у вас есть и что требуется более детально. И вам очень быстро объяснят как это делать предпочтительней.
Re[4]: Какова скорость доступа к членам класса o(...)?
От: Passerby  
Дата: 26.07.19 08:44
Оценка:
D>Отладка практически всегда медленнее. Так скорость не меряют. И естественно словарь медленнее.
Почему словарь медленнее?
Re[5]: Какова скорость доступа к членам класса o(...)?
От: Shmj Ниоткуда  
Дата: 26.07.19 08:57
Оценка:
Здравствуйте, Passerby, Вы писали:

D>>Отладка практически всегда медленнее. Так скорость не меряют. И естественно словарь медленнее.

P>Почему словарь медленнее?

Потому что для словаря нужно поиск осуществить по элементам, т.е. сопоставить элемент ключу.
Re: Какова скорость доступа к членам класса o(...)?
От: Sharov Россия  
Дата: 26.07.19 09:14
Оценка:
Здравствуйте, Passerby, Вы писали:

P>Какова скорость доступа к членам класса o(...)? Быстрее, чем у словаря?


Конечно быстрее -- одно дело вычислить смещение, а другое -- хэш объекта.
Кодом людям нужно помогать!
Re[5]: Какова скорость доступа к членам класса o(...)?
От: RushDevion Россия  
Дата: 26.07.19 09:15
Оценка: 2 (1) +1
D>>Отладка практически всегда медленнее. Так скорость не меряют. И естественно словарь медленнее.
P>Почему словарь медленнее?

Потому что a.i++ это на уровне машинных инструкций по сути одна команда — "увеличь значение по заданному адресу в памяти".
А dct["a"]++ это dct["a"] = dct["a"] + 1, т.е.:
1. Посчитать хэш символа "a"
2. Смапить посчитанный хэш на бакет внутри dct
3. Пройти линейным поиском по списку элементов внутри бакета (элемент — это ключ+значение), сравнивая ключ каждого из них с "a"
4. Вернуть значение найденного элемента, которое после инкримента опять помещается в хэш, для чего
5. Посчитать хэш символа "a"
6. Смапить посчитанный хэш на бакет внутри dct
7. Пройти линейным поиском по списку элементов внутри бакета
8. Заменить значение в найденном элементе на новое (инкрементированное) значение

Сам видишь, действий тут намного больше
Отредактировано 26.07.2019 10:23 RushDevion . Предыдущая версия .
Re[6]: Какова скорость доступа к членам класса o(...)?
От: Passerby  
Дата: 26.07.19 09:26
Оценка: -1 :)
Здравствуйте, RushDevion, Вы писали:

D>>>Отладка практически всегда медленнее. Так скорость не меряют. И естественно словарь медленнее.

P>>Почему словарь медленнее?

RD>Потому что a.i++ это на уровне машинных инструкций по сути одна команда — "увеличь значение по заданному адресу в памяти".

RD>А dct["a"]++ это dct["a"] = dct["a"] + 1, т.е.:
RD>1. Посчитать хэш символа "a"
RD>2. Смапить посчитанный хэш на бакет внутри dct
RD>3. Пройти линейным поиском по списку элементов внутри бакета (элемент — это ключ+значение), сравнивая ключ каждого из них с "a"
RD>4. Вернуть значение найденного элемента, которое опять помещается в хэш, для чего
RD>5. Посчитать хэш символа "a"
RD>6. Смапить посчитанный хэш на бакет внутри dct
RD>7. Пройти линейным поиском по списку элементов внутри бакета
RD>8. Заменить значение в найденном элементе на новое (инкрементированное) значение

RD>Сам видишь, действий тут намного больше


Как вычисляется адрес в словаре расписано, а как вычисляется адрес i в классе — нет. В словаре вычисляется адрес значения "a", в классе адрес значения i.
Отредактировано 26.07.2019 9:30 Passerby . Предыдущая версия .
Re[7]: Какова скорость доступа к членам класса o(...)?
От: Sharov Россия  
Дата: 26.07.19 09:56
Оценка: 2 (1) +1
Здравствуйте, Passerby, Вы писали:

P>Как вычисляется адрес в словаре расписано, а как вычисляется адрес i в классе — нет.


Обычное смещение, base+offset.
Кодом людям нужно помогать!
Re[2]: Какова скорость доступа к членам класса o(...)?
От: Mr.Delphist  
Дата: 26.07.19 09:57
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Passerby, Вы писали:


P>>Какова скорость доступа к членам класса o(...)? Быстрее, чем у словаря?


S>Конечно быстрее -- одно дело вычислить смещение, а другое -- хэш объекта.


А уж если части словаря разбросаны по памяти (один бакет тут — другой там), то вообще грустно.
Re[6]: Какова скорость доступа к членам класса o(...)?
От: Passerby  
Дата: 26.07.19 13:04
Оценка:
Здравствуйте, RushDevion, Вы писали:

D>>>Отладка практически всегда медленнее. Так скорость не меряют. И естественно словарь медленнее.

P>>Почему словарь медленнее?

RD>Потому что a.i++ это на уровне машинных инструкций по сути одна команда — "увеличь значение по заданному адресу в памяти".

RD>А dct["a"]++ это dct["a"] = dct["a"] + 1, т.е.:
RD>1. Посчитать хэш символа "a"
RD>2. Смапить посчитанный хэш на бакет внутри dct
RD>3. Пройти линейным поиском по списку элементов внутри бакета (элемент — это ключ+значение), сравнивая ключ каждого из них с "a"
RD>4. Вернуть значение найденного элемента, которое после инкримента опять помещается в хэш, для чего
RD>5. Посчитать хэш символа "a"
RD>6. Смапить посчитанный хэш на бакет внутри dct
RD>7. Пройти линейным поиском по списку элементов внутри бакета
RD>8. Заменить значение в найденном элементе на новое (инкрементированное) значение

RD>Сам видишь, действий тут намного больше

А если Count словаря небольшой, может, при определении значения быстрее не считать хэш, а сразу перебором сравнивать ключи?
Re[7]: Какова скорость доступа к членам класса o(...)?
От: RushDevion Россия  
Дата: 26.07.19 13:25
Оценка: 2 (1)
P>А если Count словаря небольшой, может, при определении значения быстрее не считать хэш, а сразу перебором сравнивать ключи?

Да, замена словаря с малым количеством элементом массивом — известная оптимизация.
Но, насколько я помню, в .NETовской реализации Dictionary<TKey, TValue> этого нет.
Кроме того, никто не скажет начиная с какого количества элементов такая оптимизация даст (и даст ли вообще) эффект в вашем конкретном случае.
Профилируйте.
Re[7]: Какова скорость доступа к членам класса o(...)?
От: Danchik Украина  
Дата: 26.07.19 13:37
Оценка: +4
Здравствуйте, Passerby, Вы писали:

[Skip]

P>Как вычисляется адрес в словаре расписано, а как вычисляется адрес i в классе — нет. В словаре вычисляется адрес значения "a", в классе адрес значения i.


У меня чувство что вы в C# пришли из JS — там это чуть ли не то же самое.

Лучше опишите что вам нужно сделать и зачем нужна динамика+быстродействие.
Re[7]: Какова скорость доступа к членам класса o(...)?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 26.07.19 14:33
Оценка: 2 (1) +1
Здравствуйте, Passerby, Вы писали:
P>Как вычисляется адрес в словаре расписано, а как вычисляется адрес i в классе — нет. В словаре вычисляется адрес значения "a", в классе адрес значения i.

Никак он не вычисляется — он известен на момент компиляции.
[КУ] оккупировала армия.
Re[2]: Какова скорость доступа к членам класса o(...)?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 26.07.19 14:34
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Конечно быстрее -- одно дело вычислить смещение, а другое -- хэш объекта.

Особенно если смещение вычисляется при компиляции, а не в рантайме
[КУ] оккупировала армия.
Re: Какова скорость доступа к членам класса o(...)?
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.07.19 21:56
Оценка: 2 (1)
Здравствуйте, Passerby, Вы писали:

P>Какова скорость доступа к членам класса o(...)? Быстрее, чем у словаря?


Если речь идет о C#, то это очень быстрая операция
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.