Здравствуйте, 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?
Прога критична к быстродействию. Потому заменил словари массивами. Можно существенно сократить код за счет повторно используемого кода, введя классы, в которые поместить эти массивы. Но тогда не окажется ли быстродействие тем же, что было до замены словарей массивами?
Здравствуйте, Passerby, Вы писали:
P>Здравствуйте, GarryIV, Вы писали:
P P>У словаря скорость в отладке получается раз в 20 медленнее. Может это из-за VS?
Отладка практически всегда медленнее. Так скорость не меряют. И естественно словарь медленнее.
P>Прога критична к быстродействию. Потому заменил словари массивами. Можно существенно сократить код за счет повторно используемого кода, введя классы, в которые поместить эти массивы. Но тогда не окажется ли быстродействие тем же, что было до замены словарей массивами?
Тут какая-то каша с предположениями. Объясните что у вас есть и что требуется более детально. И вам очень быстро объяснят как это делать предпочтительней.
Re[4]: Какова скорость доступа к членам класса o(...)?
Здравствуйте, Passerby, Вы писали:
D>>Отладка практически всегда медленнее. Так скорость не меряют. И естественно словарь медленнее. P>Почему словарь медленнее?
Потому что для словаря нужно поиск осуществить по элементам, т.е. сопоставить элемент ключу.
Re: Какова скорость доступа к членам класса o(...)?
D>>Отладка практически всегда медленнее. Так скорость не меряют. И естественно словарь медленнее. P>Почему словарь медленнее?
Потому что a.i++ это на уровне машинных инструкций по сути одна команда — "увеличь значение по заданному адресу в памяти".
А dct["a"]++ это dct["a"] = dct["a"] + 1, т.е.:
1. Посчитать хэш символа "a"
2. Смапить посчитанный хэш на бакет внутри dct
3. Пройти линейным поиском по списку элементов внутри бакета (элемент — это ключ+значение), сравнивая ключ каждого из них с "a"
4. Вернуть значение найденного элемента, которое после инкримента опять помещается в хэш, для чего
5. Посчитать хэш символа "a"
6. Смапить посчитанный хэш на бакет внутри dct
7. Пройти линейным поиском по списку элементов внутри бакета
8. Заменить значение в найденном элементе на новое (инкрементированное) значение
Здравствуйте, 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.
Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, Passerby, Вы писали:
P>>Какова скорость доступа к членам класса o(...)? Быстрее, чем у словаря?
S>Конечно быстрее -- одно дело вычислить смещение, а другое -- хэш объекта.
А уж если части словаря разбросаны по памяти (один бакет тут — другой там), то вообще грустно.
Re[6]: Какова скорость доступа к членам класса o(...)?
Здравствуйте, 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(...)?
P>А если Count словаря небольшой, может, при определении значения быстрее не считать хэш, а сразу перебором сравнивать ключи?
Да, замена словаря с малым количеством элементом массивом — известная оптимизация.
Но, насколько я помню, в .NETовской реализации Dictionary<TKey, TValue> этого нет.
Кроме того, никто не скажет начиная с какого количества элементов такая оптимизация даст (и даст ли вообще) эффект в вашем конкретном случае.
Профилируйте.
Re[7]: Какова скорость доступа к членам класса o(...)?
[Skip]
P>Как вычисляется адрес в словаре расписано, а как вычисляется адрес i в классе — нет. В словаре вычисляется адрес значения "a", в классе адрес значения i.
У меня чувство что вы в C# пришли из JS — там это чуть ли не то же самое.
Лучше опишите что вам нужно сделать и зачем нужна динамика+быстродействие.
Re[7]: Какова скорость доступа к членам класса o(...)?
Здравствуйте, Passerby, Вы писали: P>Как вычисляется адрес в словаре расписано, а как вычисляется адрес i в классе — нет. В словаре вычисляется адрес значения "a", в классе адрес значения i.
Никак он не вычисляется — он известен на момент компиляции.
Здравствуйте, Sharov, Вы писали:
S>Конечно быстрее -- одно дело вычислить смещение, а другое -- хэш объекта.
Особенно если смещение вычисляется при компиляции, а не в рантайме