powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Максимальный размер ConcurrentDictionary в 32-битных приложениях
25 сообщений из 196, страница 5 из 8
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39254811
void33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,
какие возможности? приведите хоть один пример. написание драйверов? дак для этого высокоуровневый ассемблер существует.
просто этот топик вакханалия безумных доморощенных программистов.
1 Ограничение на размер объекта, оно одинаковы для 32 и 64
2 Как снять это ограничение декларативно под 64
3 Что такое память процесса.
4 что такое оutоfмemory. оно не как не относится к оперативной памяти, ну разве что если все страницы памяти процессов помечены битом не выгружаемые, то вставить новую при прерывании загрузки страницы не получается (и то для юникс)
и т.д.
зы и ешо вы тут ассоциировали уборщика и оперативную память ..
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39254816
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
void33Алексей К,
какие возможности? приведите хоть один пример. написание драйверов? дак для этого высокоуровневый ассемблер существует.
просто этот топик вакханалия безумных доморощенных программистов.
1 Ограничение на размер объекта, оно одинаковы для 32 и 64
2 Как снять это ограничение декларативно под 64
3 Что такое память процесса.
4 что такое оutоfмemory. оно не как не относится к оперативной памяти, ну разве что если все страницы памяти процессов помечены битом не выгружаемые, то вставить новую при прерывании загрузки страницы не получается (и то для юникс)
и т.д.
зы и ешо вы тут ассоциировали уборщика и оперативную память ..

понос какой-то
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39254818
void33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,
обоснуй
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39254825
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
void33,

п 3 - что сказать хотел?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39254827
void33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,
да хотя бы сколько памяти для процесса гарантирует виндовс ну хотя бы для 32
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39254833
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
void33Изопропил,
да хотя бы сколько памяти для процесса гарантирует виндовс ну хотя бы для 32
памяти или адресного пространства?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39254835
void33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,
памяти
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39254971
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
void33Изопропил,
памяти
20 страниц (MinimumWorkingSetSize)
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39256226
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Изопропилэксперименты с выносом счётной части в c/с++ я бы начинал только после написания оного на c#
Да я считаю, что оно уже написано.

По сравнению с использованием ConcurrentDictionary / bool[] время работы улучшилось примерно вдвое, и стала в принципе возможной работа на больших данных, для которой в исходных версиях не хватало памяти.
Дальнейшая оптимизация, по моему разумению, возможна только в направлении накладывания более "узких" блокировок отдельными потоками, чтобы они меньше задерживали друг друга.
Есть еще направление оптимизации: уменьшение количества блокировок, т.к. блокировка сама по себе тяжелая операция. Например мой пример выше при добавлении блокировок замедляется в разы, хотя ожиданий никаких не происходит т.к. работа в один поток. Тут надо строить алгоритм так чтобы было минимум вызовов блокировок, т.е. поток получил крупный кусок данных и дальше работает с ним, а блокировки только для получения этих кусков.

Есть еще такой момент как синхронизация на уровне ядер проца: т.е. формально потоки обращаются к разным участкам памяти, но физически оба участка оказываются в одном блоке памяти (64 байта если не путаю) в итоге происходит постоянная синхронизация кэшей ядер, что замедляет оба потока. У Рихтера есть пример такого случая с замерами времени.

Есть еще такой момент как кэши процессора: если большая часть данных большую часть времени оказывается в кэше (т.е. минимум подкачки из памяти), то ускорение будет до двух раз. Например можно проходить по большому массиву много раз от начала до конца (как в моем примере), а можно перестроить алгоритм и обрабатывать фрагментами по 8-16 Кб. Второй вариант будет заметно быстрее, но алгоритм усложнится.

ИМХУ самое перспективное направление это именно адаптация алгоритма под многопоточность, а не попытка усовершенствовать блокировками однопоточный алгоритм.
AR®Не под .net я писал на C лет 8 назад последний раз в VS98 (dll для Crystal Reports).
Честно говоря, какая технология должна быть сейчас (VS2010 или VS2015), что бы родился не управляемый код, я не знаю.
Как показали тесты выше - портированием на С/С++ большого прироста не получишь. 5-15% максимум. Но напишешься вдоволь, т.к. там разных граблей намного больше чем в C#.
Если надо чтобы было быстрее, то компилятор лучше брать посвежее, т.к. все процессоры разные. Например VS98 по умолчанию компилирует под пентиум 1, а VS2015 под третий.
Есть разница даже в процах одного года выпуска: например топовые версии процов Intel поддерживают набор команд AVX, код скомпилированный с их использованием работает быстрее, но вообще не работает если проц не поддерживает AVX.
Ну и на компиляторах от МС жизнь не заканчивается. Есть другие, компиляция которыми может работать быстрее.

И третий вариант: если добавление памяти ускоряет работу, то разобраться как задействовать максимум имеющейся памяти в режиме x64. Ну и памяти в комп докупить до максимума.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39256382
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фанаты оптимизации оставили без внимания один немаловажный момент.
Сделайте класс структуруй и повторите замер. можете ещё ~10% выигратъ
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39256699
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

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

class мсstruct мсДоля4000000272489%4000000034731490%4000000007041675696%
Я как понимаю массивы это ссылочные типы, передачи самой структуры куда-либо в параметрах нет, т.е. тут применение структур не должно влиять на скорость, но ускорение есть. ХЗ почему.
ИсходникЦеликом тут 19246254
Заменить
Код: c#
1.
internal sealed class BoolArray32 {


на
Код: c#
1.
internal struct BoolArray32 {

...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39256956
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На моей мащине дало похти 2х кратное улутщение с 600мс на 230мс

Код: 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.
		internal struct BoolArray32 {
			uint[] values;
			public BoolArray32(int _size)
			{
                values = new uint[(_size - 1) / 32 + 1];
			}

            public bool Get(int _index)
            {
                return 0 < (values[_index >> 5] & (1U << (_index & 31)));
            }

            public void Set(int _index)
            {
                values[_index >> 5] |= 1U << (_index & 31);
            }
	    }

        class Programm
        {
            static Int64 Eratosfen(Int32 len)
            {
                Console.Write("Test " + len);
                var sw = Stopwatch.StartNew();
                Int64 sum = 0;
                var s = new BoolArray32(len);
                s.Set(0);
                s.Set(1);
                Int32 found = 0;
                while (found < len)
                {
                    sum += found;
                    while (found < len && s.Get(found)) found++; // Следующее простое
                    for (Int32 i = found; i < len; i += found) s.Set(i);
                }
                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);
                Console.ReadLine();
                return;
            }
        }

Dima T,
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39256963
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таким образом отставание от С++ дол+но составлятъ не более 10%
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39257220
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronНа моей мащине дало похти 2х кратное улутщение с 600мс на 230мс
Не повторяется у меня в два раза. Те же ~10%
Твой код чуть отличается от моего. uint вместо int и [] не используются.

У меня такие результаты
class (мс)struct (мс)struct/classС++ (мс)C++/structC++ safe (мс)C++ safe/struct4000000262181%1676%21100%4000000033329187%24584%28899%4000000006539620395%549789%596596%
C++ это без проверок выхода за пределы массива, C++ safe с проверками
C++ safe ближе к реальному коду, тут и 10% не выжать.
Исходник С++
Код: 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.
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.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>

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

public:

	BoolArray32(int _size)
	{
		size = _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 (values[_index >> 5] & mask1[_index & 31]);
	}

	bool GetSafe(int _index)
	{
		if (_index < 0 || _index >= size) {
			return false;
		} else {
			return (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];
	}

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

int64_t Eratosfen(int len) {
	printf("Test     %d\t" , 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 \tTime %d ms\n", sum, clock() - t);
	return sum;
}

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

int main(int argc, char**argv)
{
	Eratosfen(4000000);
	Eratosfen(40000000);
	Eratosfen(400000000);
	EratosfenSafe(4000000);
	EratosfenSafe(40000000);
	EratosfenSafe(400000000);
	return 0;
}

...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39257294
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Safe сомнительный - исключение кидать нужно, а не подавлять ошибку
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39257375
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima T,

Safe сомнительный - исключение кидать нужно, а не подавлять ошибку
Согласен отчасти. Я же честно написал "C++ safe ближе к реальному коду". Исключений тут точно не надо, иначе С++ проиграет C# по времени, а городить огород с кодами ошибок - испоганить весь пример.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39257385
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИсключений тут точно не надо, иначе С++ проиграет C# по времени
не проиграет. как и в c# при нормальном исполнении наличие обработчиков никак не сказывается на производительности
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39257389
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TИсключений тут точно не надо, иначе С++ проиграет C# по времени
не проиграет. как и в c# при нормальном исполнении наличие обработчиков никак не сказывается на производительности
Проиграет, я попробовал. Лень табличку рисовать. Я тупо вставил else throw "error" и стало медленнее.
Я не любитель исключений, для меня С++ это "С с классами". Исключения это удобно, но как все удобное - непрактично. Даже в книгах по C# рекомендуют не злоупотреблять там где этого не надо.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39257403
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
говнокод с проверкой результата в каждой строке и последующим разборов кода возврата и отсутствием ясного диагностического сообщения и сопутствующей информации - конечно практичнее
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39457552
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКак показали тесты выше - портированием на С/С++ большого прироста не получишь. 5-15% максимум. Но напишешься вдоволь, т.к. там разных граблей намного больше чем в C#.

Тут решил вернуться к прошлому лету :) , а то новое что-то очень не торопится наступить, и вместо многопоточности на C# изобразить всё то же самое в 1 потоке в приложениьице командной строки, но на C/C++.
Внимание:
Результат практически вдвое хуже , чем на C# в 1 потоке !
Как такое вообще возможно??
Содержательная часть кода идентична .
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39457563
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поясню немного.
Содержательная часть кода - цикл, на который тратится почти всё время работы.
Идентична - значит может быть скопирована из одного места и вставлена в другое (из C# в C++ и/или наоборот).
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39457631
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Результат практически вдвое хуже , чем на C# в 1 потоке !
Неплохо бы код тестов показать, прежде чем такие громкие заявления делать.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39457766
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tтакие громкие заявления

Так сам удивлён, мягко говоря, наблюдаемым результатам. Поэтому и "громкость".
Повторяю: основной рабочий цикл идентичен, с точностью до пробелов слева.
И это при том, что в варианте на C# ещё делается работа по помещению найденных в цикле результатов в упакованный массив, а в тестовом примере на C есть только счётчик количества найденного (чтобы косвенно оценить правильность алгоритма).
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39457779
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Повторяю: основной рабочий цикл идентичен, с точностью до пробелов слева.
Наверно поэтому и тормозит. С/С++ и C# это разные ЯП, хоть и с похожим синтаксисом. Скорее всего что-то в коде было такое что пишется одинаково, но означает не одно и тоже.
Например
Код: c#
1.
void func(string s)


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


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