powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Максимальный размер ConcurrentDictionary в 32-битных приложениях
25 сообщений из 196, страница 3 из 8
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39249951
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДелаешь копию и потом ее добавляешь в кэш. Соответственно при чтении из кэша копию с кэша. Т.к. сама копия в кэше не меняется, то для доступа к ней блокировок не надо. Для экономии памяти можно пожать при записи в кэш.

Понял. Только для моего случая это вряд ли оправданно. В том смысле, что общее время работы вырастет. А проблему нехватки памяти процессу я "надолго"(думаю, до 2^31) решил использованием BoolArray32.

Не совсем понял "трюка" с _lock (формальным объектом?) в последней версии решета Эратосфена. Для lock всё равно что ли, что будет у него в ()? Можно пояснить?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250009
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Не совсем понял "трюка" с _lock (формальным объектом?) в последней версии решета Эратосфена. Для lock всё равно что ли, что будет у него в ()? Можно пояснить?
Скопипастил откуда-то, можно было написать lock(values).
В остальном без разницы какой объект блокировать, главное чтобы все места кода блокировали один и тот же объект.
Т.е. блокировка это по сути флаг, установить который может только один поток, второй (при попытке установить) будет ждать пока первый закончит.
Если кратко, алгоритм использования блокировок такой: установить флаг, поработать со всеми объектами которые он защищает, снять флаг. Т.е. не надо 10 блокировок для 10 взаимосвязанных объектов, достаточно одной.
Почитай Рихтера, глава "Класс Monitor и блоки синхронизации" там подробно расписано как это устроено.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250025
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПочитай Рихтера, глава "Класс Monitor и блоки синхронизации" там подробно расписано как это устроено.
Лучше про ReaderWriterLockSlim
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250188
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил пока сосредоточиться на оптимизациях самого алгоритма и задумался: конструкция вида
Код: c#
1.
values = new int[valuesSize]; 


гарантирует инициализацию всего массива нулями?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250195
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Решил пока сосредоточиться на оптимизациях самого алгоритма и задумался: конструкция вида
Код: c#
1.
values = new int[valuesSize]; 


гарантирует инициализацию всего массива нулями?
Да.
Не совсем то, но похожий случай https://msdn.microsoft.com/ru-ru/library/0a7fscd0.aspx
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250198
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно, насколько быстрее будет аккуратно написанное на С
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250221
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, что тогда более правильно делать много (миллионы) раз за время выполнения программы
Код: c#
1.
2.
3.
values = null;
GC.Collect();
values = new int[valuesSize]; 


или
Код: c#
1.
2.
3.
            
for (int i = 0; i < valuesSize; i++)
    values[i] = 0;



Изопропилинтересно, насколько быстрее будет аккуратно написанное на С
Тут весь вопрос, на каком C, и чем он будет скомпилирован. Вы, возможно, имели ввиду, что результат будет не под .Net ?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250267
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Вы, возможно, имели ввиду, что результат будет не под .Net ?
естесnвенно без dotnet

а с компиляторами вариантов немного - MSVC и gcc
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250270
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилинтересно, насколько быстрее будет аккуратно написанное на С
Если совсем без проверок на корректность параметров, то результаты такие (MSVC2015 x86)
Размерc# мсc++ мсОтношение10000006350%200000013862%4000000271763%8000000563664%10000000724563%2000000015510568%4000000036125170%8000000099269770%100000000138597971%2000000003246252878%4000000007075555378%800000000147221205782%
Исходник
Код: plaintext
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.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>

class BoolArray32 {
	int* values;
	int mask0[32], mask1[32];

public:

	BoolArray32(int _size)
	{
		values = (int*) calloc((_size - 1) / 32 + 1, sizeof(int));

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

	~BoolArray32() {
		free(values);
	}

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

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

int64_t Eratosfen(int len) {
	printf("Test %d" , len);
	clock_t t = clock();
	int64_t sum = 0;
	BoolArray32 s(len);
	s.Set(0, true);
	s.Set(1, true);
	int found = 0;
	while (found < len) {
		sum += found;
		while (found < len && s.Get(found)) found++; // Следующее простое
		for (int i = found; i < len; i += found) s.Set(i, true);
	}
	printf(" result %lld Time %d ms\n", sum, clock() - t);
	return sum;
}

int main(int argc, char**argv)
{
	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 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250282
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Интересно, что тогда более правильно делать много (миллионы) раз за время выполнения программы
Код: c#
1.
2.
3.
values = null;
GC.Collect();
values = new int[valuesSize]; 


или
Код: c#
1.
2.
3.
            
for (int i = 0; i < valuesSize; i++)
    values[i] = 0;


ИМХУ второе. Но затести, может для твоего случая первое окажется быстрее.

Тут еще учитывай тот момент что запуск сборки мусора останавливает все потоки.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250285
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и это
Код: c#
1.
2.
for (int i = 0; i < valuesSize; i++)
    values[i] = 0;


в книжках рекомендуют писать так
Код: c#
1.
2.
for (int i = 0; i < values.Length; i++)
    values[i] = 0;


утверждают так работает быстрее. Объясняют тем что компилятор убирает проверку индекса на выход за границы массива.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250297
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
[src c#]
for (int i = 0; i < valuesSize; i++)
values[i] = 0;



Обычно делают что то типа
[src c#]
for (int i = 0; i < valuesSize; i++++)
values[i] = 0;
values[i+1] = 0;

[/quot]
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250306
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ, вот что Рихтер пишет по этому поводу
Внутренняя реализация массивов...Кроме того, в общем случае компилятор умеет выносить код проверки границ за пределы цикла. К примеру, рассмотрим следующий код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
using System;
public static class Program {  
  public static void Main() {    
    Int32[] a = new Int32[5];
    for(Int32 index = 0; index < a.Length; index++) {
       // Какие-то действия с элементом a[index]
    }
  }
 } 


Обратите внимание на вызов свойства Length в проверочном выражении цикла for. Фактически при этом вызывается метод, но JIT-компилятор «знает», что Length является свойством класса Array, поэтому создает код, в котором метод вызывается всего один раз, а полученный результат сохраняется в промежуточной переменной. Именно ее значение проверяется на каждой итерации цикла. В результате такой код работает очень быстро. Некоторые разработчики недооценивают возможности JIT-компилятора и пишут «умный код», пытаясь помочь его работе. Однако такие попытки практически всегда приводят к снижению производительности, а также делают готовую программу непонятной и неудобной для редактирования. Поэтому пусть свойство Length вызывается автоматически.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250505
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

замена BoolArray32 на BoolArray64 дала серьёзный позитивный эффект (с++)
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250554
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima T,

замена BoolArray32 на BoolArray64 дала серьёзный позитивный эффект (с++)
x86 или x64 ?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250578
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИзопропилDima T,

замена BoolArray32 на BoolArray64 дала серьёзный позитивный эффект (с++)
x86 или x64 ?
ошибка закралась...

ничего не помогает. inline, замена маски на сдвиг, Set(,true) без ветвления.
машинный код чистый, всё что можно на регистрах.

потеря в 20% - наверное неплохой результат для dotnet
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39250655
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилпотеря в 20% - наверное неплохой результат для dotnet
На самом деле еще меньше. Пробовал в код С++ добавить контроль выхода индекса за пределы - время лучше на 10-15% по сравнению с C#. Так что результат очень даже неплохой.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39251126
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tв книжках рекомендуют писать так

Код: c#
1.
2.
for (int i = 0; i < values.Length; i++)
    values[i] = 0;



утверждают так работает быстрее. Объясняют тем что компилятор убирает проверку индекса на выход за границы массива.

Категорически опровергаю . Потеря общего времени работы 3-5%, причём устойчиво повторяющаяся.

Изопропилзамена BoolArray32 на BoolArray64 дала серьёзный позитивный эффект (с++)
На C# только проигрыш, что на 32-, что на 64-битной ОС.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39251179
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВОбычно делают что то типа
Код: c#
1.
2.
3.
4.
5.
for (int i = 0; i < valuesSize; i++++)
{
    values[i] = 0;
    values[i+1] = 0;
}





Результат, увы, не лучше. Даже если написать values[i] = values[i+1] = 0;
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39251184
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®, Array.Clear(arr, 0, arr.Length) также?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39251323
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser Array.Clear(arr, 0, arr.Length)

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

В какой-то момент сообразил, что в моём алгоритме нигде не требуется сбрасывать отдельный элемент в BoolArray32 в false, а только устанавливать в true.
И написал вместо
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
        public void set(int _index, bool _value)
        {
            int valuesIndex = _index >> 5;  

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



сначала
Код: c#
1.
2.
3.
4.
5.
6.
        public void settrue(int _index)
        {
            int valuesIndex = _index >> 5;  

            values[valuesIndex] |= mask1[_index & 31]; 
        }



а потом
Код: c#
1.
2.
3.
4.
        public void settrue(int _index)
        {
            values[_index >> 5] |= mask1[_index & 31]; 
        }


(и звал settrue() вместо set() )

Первая "оптимизация" приводит к потере времени ~на 15%, вторая ещё на 2-4%
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39253490
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Первая "оптимизация" приводит к потере времени ~на 15%, вторая ещё на 2-4%
странно это всё....
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39253524
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
ггыгы)))
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39253747
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было бы смешно, кабы не было так грустно.
Единицы процентов на длительностях порядка суток дают затраты порядка часов.
Поэтому экспериментирую с "мелочами".
...
Рейтинг: 0 / 0
25 сообщений из 196, страница 3 из 8
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Максимальный размер ConcurrentDictionary в 32-битных приложениях
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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