powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Максимальный размер ConcurrentDictionary в 32-битных приложениях
25 сообщений из 196, страница 2 из 8
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39245051
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Dima TInt16 и byte отпадают Interlocked.CompareExchange() перегружен только для Int32 и Int64
Я имел ввиду, что если городить совсем свой огород и не закладываться на использование Interlocked, в каком случае обращение к требуемому биту будет быстрее: с byte, Int16, Int32, Int64?
Не знаю. Затести. Есть подозрение что будет одинаково по скорости (за исключением Int64 в х32 режиме). У процов есть свои тонкости, кое-какая заточка на 32-бита (выравнивание в памяти и т.д.).
Код легко меняется под нужный тип. Например если данные в byte[] то просто во всем коде замени 32 на 8, т.е. на количество бит в одном элементе массива.
AR®И ещё: byte и Int16 будут занимать в памяти в случае большого массива из них действительно байт и 2 соответственно?
Все верно. byte - 1 байт, Int16 - 2 байта.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39245084
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®выяснил, что, например, BitArray даёт время работы раза ~в 4 больше, чем bool[ ] (он используется у меня в каждом отдельном потоке).
Можно немного пооптимизировать. Заменить
Код: c#
1.
1 << (index % 32)


на массив
Код: c#
1.
static Int32[32] mask = new Int32[32];


заполнить его один раз и использовать
Код: c#
1.
mask[index % 32]


В С/С++ это дает ускорение, в C# не знаю, т.к. будет еще доп.проверка на выход за границу массива. Тоже мерить надо.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39247454
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вести с полей.
Таблица ниже содержит времена работы одного и того же алгоритма (чч:мм:сс.мс), в котором для массивов значений bool поочерёдно использовались разные технологии. Первая колонка - размер массивов в виде показателя степени двойки.

2^...bool[]BitArrayBoolArray8BoolArray16BoolArray32BoolArray641400:00:00.30000:00:00.46200:00:00.37200:00:00.36200:00:00.26200:00:00.4521500:00:00.63200:00:01.31200:00:00.82200:00:01.13200:00:00.89200:00:01.3721600:00:02.02200:00:04.76200:00:02.73200:00:03.97200:00:02.66100:00:04.8121700:00:09.36000:00:20.55000:00:11.97300:00:16.98000:00:11.95100:00:21.0601800:00:29.17200:01:09.47000:00:38.13000:00:56.96000:00:38.48800:01:11.5581900:02:33.76100:05:31.83800:03:10.32000:04:34.24000:03:14.55100:05:38.0462000:11:28.82600:18:19.24800:10:12.39000:15:42.78400:10:06.40600:19:01.1502101:19:16.90501:20:06.12100:45:34.475не проверял00:46:46.476не проверял

BitArray - это упоминавшийся в теме System.Collections.BitArray.
BoolArray8, BoolArray16, BoolArray32, BoolArray64 - это мои классы, в которых для упаковки значений bool использовались соответственно byte, short, int, long.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39247461
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Некоторые выводы.

1. Самописные классы существенно эффективнее BitArray
2. Использование для упаковки short приблизительно в полтора раза хуже использования byte, а long - ещё хуже (на 32-битной ОС)
3. Использование byte приблизительно равнозначно использованию int.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39247486
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почти совпало с моими предсказаниями 19228795 . Странный результат с short, проверь что в коде BoolArray16 ничего не напутано. long надо на x64 тестить.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39247889
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Класс BoolArray16:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
    internal class BoolArray16
    {
        short[] values, mask0, mask1;

        public BoolArray16(int _size)
        {
            values = new short[(_size - 1) / 16 + 1];

            mask1 = new short[16];
            mask0 = new short[16];
            for (int i = 0; i < 16; i++)
            {
                mask1[i] = (short)(1 << i);
                mask0[i] = (short)~mask1[i];
            }
        }

        public bool get(int _index)
        {
            return 0 != (values[_index >> 4] & mask1[_index & 15]);
        }

        public void set(int _index, bool _value)
        {
            int valuesIndex = _index >> 4;

            if (_value)
                values[valuesIndex] = (short)(values[valuesIndex] | mask1[_index & 15]);
            else
                values[valuesIndex] = (short)(values[valuesIndex] & mask0[_index & 15]);
        }
    }
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248052
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®,
что то меня берут сомнения
у вас на 20
bool[] -00:11:28.826;
BoolArray16 -00:15:42.784
у меня 5 миллисекунд и 20 соответственно
обыкновенный цикл заполнения и считывания?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248081
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Класс BoolArray16:...
Выглядит нормально. Значит в .net что-то недооптимизировано с short

Где-то в степи что то меня берут сомнения
у вас на 20
Не 20 а 2^20, и, как понял, гонял он какой-то свой алгоритм чего-то считающий с интенсивным использованием массива bool[].
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248096
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
я и написал на 20( читать 2^20)
какой может быть алгоритм доступа к массиву?,BoolArray16 - это я вижу
а где код замеров, обычно когда выкладываю таблицу замеров - принято и выкладывать весь механизм замера,
тем более выводить по ним резюме...
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248111
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выкладывать весь алгоритм и его цель я не буду, но суть опишу.
В нескольких параллельно работающих потоках (приблизительно равноправных по объёму работы) создаются массивы значений bool указанного размера. По ходу решения задачи они многократно заполняются по определённой логике и по окончании шага цикла очищаются.

Механизм замера - вызов DateTime.Now в начале работы и DateTime.Subtract() в конце.

Есть, конечно, погрешность, связанная с непостоянной текущей загруженностью компа во время работы.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248121
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё. Если дорисовать в классе public bool this[int index] и обращаться как к элементам массива, то работа замедляется приблизительно на 3%, что для меня не мало.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248131
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиDima T,
я и написал на 20( читать 2^20)
какой может быть алгоритм доступа к массиву?,BoolArray16 - это я вижу
а где код замеров, обычно когда выкладываю таблицу замеров - принято и выкладывать весь механизм замера,
тем более выводить по ним резюме...
ИМХУ твой тест не показательный. Он очень быстро происходит, а разницу в 10 мс можно просто списать на погрешность измерения. Да и линейный он, что тоже редко встречается в реальной жизни.
Если уж полноценное тестирование устраивать, то надо какой-нибудь долгоиграющий несложный алгоритм, который непоследовательно будет обращаться к разным элементам. Например посчитать количество/сумму всех простых чисел до N Решетом Эратосфена .

А так в целом результаты AR® достаточно показательны, если он менял только тип массива. Правда немного смущает что многопоточно работало.

PS Как подозреваю bool[] становится медленнее когда перестает влазить в кэш проца. Битовый массив в 8 раз меньше памяти занимает. Если так, то тут играет роль не только размер массива, но и остального что в это время используется. Т.е. для разных алгоритмов этот "пограничный" размер будет разный.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248139
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T Правда немного смущает что многопоточно работало.
Подчеркну, что здесь речь про массивы, используемые каждый в своём потоке, к ним нет конкурентного доступа.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248150
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
ну давай возьмем,^30
массив 11 секунд
костыль 23 секунды
замерял наручными часами, или есть желание через песочные?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248233
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиDima T,
ну давай возьмем,^30
массив 11 секунд
костыль 23 секунды
замерял наручными часами, или есть желание через песочные?
Топик читать не пробовал? Твой результат совпадает с результатом AR® (и моим тоже). BoolArray16 (на short[]) самый тормозной. В 1,5-2 раза медленнее bool[]

Поправил под Int32. Результаты такие
Размерbool[] мсBoolArray32() мсСоотношение100000046150%2000000913144%40000002527108%8000000655686%10000000887282%2000000025415561%4000000061236159%80000000134799274%1000000001736138580%2000000003663324689%4000000007747707591%800000000161701472291%
Исходник. Сумма всех простых решетом Эратосфена
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
		internal sealed class BoolArray32 {
			Int32[] values, mask0, mask1;

			public BoolArray32(Int32 _size)
			{
				values = new Int32[(_size - 1) / 32 + 1];

				mask1 = new Int32[32];
				mask0 = new Int32[32];
				for (int i = 0; i < 32; i++)
				{
					mask1[i] = (1 << i);
					mask0[i] = ~mask1[i];
				}
			}

			public bool this[int index] {
				get {return Get(index); }
				set {Set(index,value); }
			}

			public bool Get(int _index)
			{
				return 0 != (values[_index >> 5] & mask1[_index & 31]);
			}

			public void Set(int _index, bool _value)
			{
				int valuesIndex = _index >> 5;

				if (_value)
					values[valuesIndex] |= mask1[_index & 31];
				else
					values[valuesIndex] &= mask0[_index & 31];
			}
	    }

		static Int64 Eratosfen(Int32 len) {
			Console.Write("Test " + len);
			var sw = Stopwatch.StartNew();
			Int64 sum = 0;
// закаментить ненужное
			//var s = new bool[len];
			var s = new BoolArray32(len);
			s[0] = true;
			s[1] = true;
			Int32 found = 0;
			while(found < len) {
				sum += found;
				while(found < len && s[found]) found++; // Следующее простое
				for(Int32 i = found; i < len; i += found) s[i] = true;
			}
			Console.WriteLine(" result " + sum + " Time " + sw.ElapsedMilliseconds + " ms");

			return sum;
		}

		static void Main(string[] args) {
			Eratosfen(1000000);
			Eratosfen(2000000);
			Eratosfen(4000000);
			Eratosfen(8000000);
			Eratosfen(10000000);
			Eratosfen(20000000);
			Eratosfen(40000000);
			Eratosfen(80000000);
			Eratosfen(100000000);
			Eratosfen(200000000);
			Eratosfen(400000000);
			Eratosfen(800000000);
			return;
		}

...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248317
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Dima T Правда немного смущает что многопоточно работало.
Подчеркну, что здесь речь про массивы, используемые каждый в своём потоке, к ним нет конкурентного доступа.
Я о другом. Допустим есть 4 потока, запускаются одновременно, ты меришь по последнему, предположим в одном случае последним заканчивает например 1-й, в другом 3-й. В итоге получается ерунда: замеры двух разных расчетов (на разных исходных данных). Другой момент - включен гипертрейдинг на проце, например два потока могу оказаться на одном реальном ядре, а могут на двух разных. Тут тоже заметная разница будет. 2-хядерный проц с HT (виндовс показывает как 4 ядра) реально работает с производительностью максимум ~2,5 ядра, т.е. 4 потока в 2,5 раза быстрее чем 1, но 2 потока в 2 раза быстрее. (при условии что синхронизация не требуется)
Не утверждаю что у тебя что-то из описанного было, я к тому что для чистоты эксперимента замеры лучше делать однопоточно.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248333
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делал столько потоков, сколько возвращает Environment.ProcessorCount. У меня это 4.
По ходу экспериментов выяснилось, что диспетчер задач показывает загрузку прямо пропорционально количеству "вычислительных" потоков (если их <=4), т.е. для 1 потока - 25%, 2 - 50 %, 3 - 75 %, 4 - 99%.
Т.е. можно считать, что каждый поток всё-таки оказывается в отдельном ядре.

И ещё интересно, что диспетчер задач показывает для моей программы общее число потоков 9. При 4 запущенных мной явно это означает, что в 5 потоках "живёт" единственное окно с полями и кнопкой?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248362
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Я делал столько потоков, сколько возвращает Environment.ProcessorCount. У меня это 4.
По ходу экспериментов выяснилось, что диспетчер задач показывает загрузку прямо пропорционально количеству "вычислительных" потоков (если их <=4), т.е. для 1 потока - 25%, 2 - 50 %, 3 - 75 %, 4 - 99%.
Т.е. можно считать, что каждый поток всё-таки оказывается в отдельном ядре.
ОС (в т.ч. диспетчер задач) показывает загрузку логических процов, а не реальных, т.е. при включенном Hyper-threading половина процов "муляж".
Например на 4-хядерном i7 без гипертрейдинга 4 потока считают в 4 раза быстрее чем один, на 2-хядерном i5 c гипертрейдингом - в 2,5 раза. Хотя в обоих случаях диспетчер честно показывает 4 логических проца загруженных на 100%.

AR®И ещё интересно, что диспетчер задач показывает для моей программы общее число потоков 9. При 4 запущенных мной явно это означает, что в 5 потоках "живёт" единственное окно с полями и кнопкой?
Это пул потоков заранее создал запасные, на случай если что-то асинхронно надо будет выполнять.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248371
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На моём компе до размера массивов 2^17 наблюдалось довольно чёткое учетверение при переходе от 1 потока к 4.
При 2^18 и 2^19 - ближе к утроению, дальше - ближе к удвоению.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248420
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®На моём компе до размера массивов 2^17 наблюдалось довольно чёткое учетверение при переходе от 1 потока к 4.
При 2^18 и 2^19 - ближе к утроению, дальше - ближе к удвоению.
Проц какой? Сколько реальных ядер?

Тут еще такой момент есть: расчет должен быть поделен между потоками равномерно. Может оказаться что стартуют все 4 одновременно, но один работает секунду, второй - две, третий - 3, 4-й - четыре. В итоге общее время 10 секунд, но отработало за 4 (максимальное), хотя в идеале должно быть 2,5 (10/4). Ну и Закон Амдала мешает если есть хоть мало-мальская синхронизация.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248675
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Intel Core i3-2120 @ 3,3 ГГц.

Диспетчер устройств показывает четыре процессора, а сколько реальных ядер, я не знаю.
Работа разделена между потоками достаточно поровну, а синхронизации между потоками нет за ненадобностью.
Есть "взаимопомощь" между потоками, когда побочный результат работы одного потока снимает часть работы с другого, что и вынудило копать в сторону ConcurrentDictionary.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248698
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®сколько реальных ядер, я не знаю.
http://ark.intel.com/ru/products/53426/Intel-Core-i3-2120-Processor-3M-Cache-3_30-GHz
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248699
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Intel Core i3-2120 @ 3,3 ГГц.

Диспетчер устройств показывает четыре процессора, а сколько реальных ядер, я не знаю.
На сайте интела все написано Intel Core i3-2120 . Реальных 2 ядра у тебя.
На расчетных задачах максимум ускорения в 2,5 раза, при полной загрузке всех логических процов на 100%

AR®Работа разделена между потоками достаточно поровну, а синхронизации между потоками нет за ненадобностью.
Есть "взаимопомощь" между потоками, когда побочный результат работы одного потока снимает часть работы с другого, что и вынудило копать в сторону ConcurrentDictionary.
Если есть какие-то промежуточные результаты необходимые разным потокам, то может есть смысл сами результаты кэшировать. Т.е. досчитал до места, которое возможно уже посчитано, заглянул в кэш, если есть - взял, если нет - посчитал, записал в кэш. Кэш делать тем же ConcurrentDictionary, а внутри как есть оставить. Тут алгоритм надо смотреть, что кэшировать и сколько места под кэш надо.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39248766
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли есть какие-то промежуточные результаты необходимые разным потокам, то может есть смысл сами результаты кэшировать. Т.е. досчитал до места, которое возможно уже посчитано, заглянул в кэш, если есть - взял, если нет - посчитал, записал в кэш. Кэш делать тем же ConcurrentDictionary, а внутри как есть оставить.

Именно так всё и сделано с самого начала. Только с ростом размера данных пришлось отказаться от ConcurrentDictionary в пользу BitArray и lock{}.


Попутно поделюсь ещё одним открытием, про которое не знают даже в MS :)
Замена кода
Код: c#
1.
2.
                values[valuesIndex] = values[valuesIndex] | mask1[_index & 31];
                values[valuesIndex] = values[valuesIndex] & mask0[_index & 31];


на
Код: c#
1.
2.
                values[valuesIndex] |= mask1[_index & 31];
                values[valuesIndex] &= mask0[_index & 31];



в моём BoolArray32 не приводит ни к чему, а аналогичная в BoolArray8, BoolArray16 - к потере скорости на 15-20 %
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39249244
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Именно так всё и сделано с самого начала. Только с ростом размера данных пришлось отказаться от ConcurrentDictionary в пользу BitArray и lock{}.
Я другое предлагал. Делаешь копию и потом ее добавляешь в кэш. Соответственно при чтении из кэша копию с кэша. Т.к. сама копия в кэше не меняется, то для доступа к ней блокировок не надо. Для экономии памяти можно пожать при записи в кэш.
Т.е. кэш это ConcurrentDictionary<KEY, BoolArray32> где KEY какой-то тип отражающий общее состояние BoolArray32.

Раз уж начали - затестил разные блокировки. У меня получается с Interlocked в 3 раза медленнее, с Lock в 7 раз медленнее чем без блокировок.
Исходник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
		internal sealed class BoolArray32 {
			Int32[] values, mask0, mask1;
			Object _lock = new object();

			public BoolArray32(Int32 _size)
			{
				values = new Int32[(_size - 1) / 32 + 1];

				mask1 = new Int32[32];
				mask0 = new Int32[32];
				for (int i = 0; i < 32; i++)
				{
					mask1[i] = (1 << i);
					mask0[i] = ~mask1[i];
				}
			}

			public bool this[int index] {
				get {return Get(index); }
				set {Set(index,value); }
			}

			public bool Get(int _index)
			{
				return 0 != (values[_index >> 5] & mask1[_index & 31]);
			}

			public void Set(int _index, bool _value)
			{
				if (_value)
					values[_index >> 5] |= mask1[_index & 31];
				else
					values[_index >> 5] &= mask0[_index & 31];
			}

			public void SetInterlocked(int _index, bool _value) {
				Int32 cur, val;
				do {
					cur = values[_index >> 5];
					if (_value) {
						val = cur | mask1[_index & 31];
					} else {
						val = cur & mask0[_index & 31];
					}
				} while (cur != val && cur != Interlocked.CompareExchange(ref values[_index >> 5], val, cur));
			}

			public void SetLock(int _index, bool _value) {
				if(Get(_index) == _value) return;
				lock(_lock) {
					if (_value)
						values[_index >> 5] |= mask1[_index & 31];
					else
						values[_index >> 5] &= mask0[_index & 31];
				}
			}


		}

		static Int64 Eratosfen(Int32 len) {
			GC.Collect();
			Console.Write("Test " + len);
			var sw = Stopwatch.StartNew();
			Int64 sum = 0;
			var s = new BoolArray32(len);
			s.Set(0, true);
			s.Set(1, true);
			Int32 found = 0;
			while(found < len) {
				sum += found;
				while(found < len && s[found]) found++; // Следующее простое
				for(Int32 i = found; i < len; i += found) s.Set(i, true);
			}
			Console.WriteLine(" result " + sum + " Time " + sw.ElapsedMilliseconds + " ms");
			return sum;
		}

		static Int64 EratosfenLock(Int32 len) {
			GC.Collect();
			Console.Write("Test Lock " + len);
			var sw = Stopwatch.StartNew();
			Int64 sum = 0;
			var s = new BoolArray32(len);
			s.SetLock(0, true);
			s.SetLock(1, true);
			Int32 found = 0;
			while(found < len) {
				sum += found;
				while(found < len && s[found]) found++; // Следующее простое
				for(Int32 i = found; i < len; i += found) s.SetLock(i, true);
			}
			Console.WriteLine(" result " + sum + " Time " + sw.ElapsedMilliseconds + " ms");
			return sum;
		}

		static Int64 EratosfenInterlocked(Int32 len) {
			GC.Collect();
			Console.Write("Test Interlocked " + len);
			var sw = Stopwatch.StartNew();
			Int64 sum = 0;
			var s = new BoolArray32(len);
			s.SetInterlocked(0, true);
			s.SetInterlocked(1, true);
			Int32 found = 0;
			while(found < len) {
				sum += found;
				while(found < len && s[found]) found++; // Следующее простое
				for(Int32 i = found; i < len; i += found) s.SetInterlocked(i, true);
			}
			Console.WriteLine(" result " + sum + " Time " + sw.ElapsedMilliseconds + " ms");

			return sum;
		}

		static void Main(string[] args) {
			Eratosfen(1000000);
			EratosfenInterlocked(1000000);
			EratosfenLock(1000000);
			Eratosfen(2000000);
			EratosfenInterlocked(2000000);
			EratosfenLock(2000000);
			Eratosfen(4000000);
			EratosfenInterlocked(4000000);
			EratosfenLock(4000000);
			Eratosfen(8000000);
			EratosfenInterlocked(8000000);
			EratosfenLock(8000000);
			return;
}

...
Рейтинг: 0 / 0
25 сообщений из 196, страница 2 из 8
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Максимальный размер ConcurrentDictionary в 32-битных приложениях
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]