powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Максимальный размер ConcurrentDictionary в 32-битных приложениях
25 сообщений из 196, страница 6 из 8
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39457801
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСкорее всего что-то в коде было такое что пишется одинаково, но означает не одно и тоже.
Но при этом работает одинаково!
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
    do
    {
	int lsb = reg & 1;
	reg >>= 1;
	reg ^= (-lsb) & schema;
	shiftcnt++;
    }
    while (reg != regstart && shiftcnt < mmax);


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


С++ создаст копию s, а C# передаст ссылку. Второе намного быстрее.
C# передаст ссылку на ссылку :)
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39457905
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Что может измениться при переносе этого фрагмента из C# в C++?
Тут ничего. Затестил твой цикл. С++ быстрее.
Результат:
C++C#939 мс1145 мс
Исходники
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <stdio.h>
#include <time.h>

int main()
{
	int regstart = 12345, schema = 67890, mmax = 100500000, shiftcnt = 0, check = 0;
	while(shiftcnt < 1000000000) {
		int reg = regstart;
		do
		{
			int lsb = reg & 1;
			reg >>= 1;
			reg ^= (-lsb) & schema;
			shiftcnt++;
		} while (reg != regstart && shiftcnt < mmax);
		regstart++;
		check++;
	}
	printf("shiftcnt=%d  check=%d  time %d ms\n", shiftcnt, check, clock());
	return 0;
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
		static void Main(string[] args) {
			var sw = Stopwatch.StartNew();
			int regstart = 12345, schema = 67890, mmax = 100500000, shiftcnt = 0, check = 0;
			while(shiftcnt < 1000000000) {
				int reg = regstart;
				do
				{
					int lsb = reg & 1;
					reg >>= 1;
					reg ^= (-lsb) & schema;
					shiftcnt++;
				} while (reg != regstart && shiftcnt < mmax);
				regstart++;
				check++;
			}
			Console.WriteLine($"shiftcnt={shiftcnt}  check={check}  time {sw.ElapsedMilliseconds} ms");
		}



MSVC 2015 x86

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
do
{
	if ((reg & 1) == 0)
		reg >>= 1;
	else
		reg = (reg >> 1) ^ schema;
	shiftcnt++;
}
while (reg != regstart && shiftcnt < mmax);



Выросло ли время? И в C# и в C++?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39457973
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T AR®Что может измениться при переносе этого фрагмента из C# в C++?
Тут ничего. Затестил твой цикл. С++ быстрее.
Результат:
C++C#939 мс1145 мс
Исходники
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <stdio.h>
#include <time.h>

int main()
{
	int regstart = 12345, schema = 67890, mmax = 100500000, shiftcnt = 0, check = 0;
	while(shiftcnt < 1000000000) {
		int reg = regstart;
		do
		{
			int lsb = reg & 1;
			reg >>= 1;
			reg ^= (-lsb) & schema;
			shiftcnt++;
		} while (reg != regstart && shiftcnt < mmax);
		regstart++;
		check++;
	}
	printf("shiftcnt=%d  check=%d  time %d ms\n", shiftcnt, check, clock());
	return 0;
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
		static void Main(string[] args) {
			var sw = Stopwatch.StartNew();
			int regstart = 12345, schema = 67890, mmax = 100500000, shiftcnt = 0, check = 0;
			while(shiftcnt < 1000000000) {
				int reg = regstart;
				do
				{
					int lsb = reg & 1;
					reg >>= 1;
					reg ^= (-lsb) & schema;
					shiftcnt++;
				} while (reg != regstart && shiftcnt < mmax);
				regstart++;
				check++;
			}
			Console.WriteLine($"shiftcnt={shiftcnt}  check={check}  time {sw.ElapsedMilliseconds} ms");
		}



MSVC 2015 x86

Как я и подозревал - тормоз где-то в другом месте.Тормоз C# обычно из-за проверки границ массивов. Если писать на C# unsafe с указателями, то отличий от C++ практически нет. В качестве теста рекомендую сортировку "пузырьком", реализовать три варианта: C++ , C# и C#+unsafe+указатели .
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39457981
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Выросло ли время? И в C# и в C++?
ТестC++C#До замены939 мс1145 мсПосле замены890 мс1402 мс
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39457991
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КТормоз C# обычно из-за проверки границ массивов. Если писать на C# unsafe с указателями, то отличий от C++ практически нет. В качестве теста рекомендую сортировку "пузырьком", реализовать три варианта: C++ , C# и C#+unsafe+указатели .
Это понятно.

Замеры начались с обратного утверждения 20501935
AR®Тут решил вернуться к прошлому лету :) , а то новое что-то очень не торопится наступить, и вместо многопоточности на C# изобразить всё то же самое в 1 потоке в приложениьице командной строки, но на C/C++.
Внимание:
Результат практически вдвое хуже , чем на C# в 1 потоке !
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39457993
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку: тут делал тест во времена своей молодости.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458000
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TАлексей КТормоз C# обычно из-за проверки границ массивов. Если писать на C# unsafe с указателями, то отличий от C++ практически нет. В качестве теста рекомендую сортировку "пузырьком", реализовать три варианта: C++ , C# и C#+unsafe+указатели .
Это понятно.

Замеры начались с обратного утверждения 20501935
AR®Тут решил вернуться к прошлому лету :) , а то новое что-то очень не торопится наступить, и вместо многопоточности на C# изобразить всё то же самое в 1 потоке в приложениьице командной строки, но на C/C++.
Внимание:
Результат практически вдвое хуже , чем на C# в 1 потоке !Да я это не в упрёк. Просто обозначил факт, который в этом обсуждении, как мне показалось, не упоминался.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458032
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAR®Выросло ли время? И в C# и в C++?
ТестC++C#До замены939 мс1145 мсПосле замены890 мс1402 мс

Очень интересно. У меня вырастает и в C# и в C++.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458063
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®Очень интересно. У меня вырастает и в C# и в C++.
Компилятор С++ какой? У меня MSVC 2015 компилирую в x86. Для запуска везде дави Ctrl+F5, так без отладчика запускается.

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

Содержательно оба варианта кода делают одно и то же.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458133
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AR®,
не знаю что там клок делает, но sw то тормазни перед Console.WriteLine
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458145
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВдогонку: тут делал тест во времена своей молодости.
Позапускал код по ссылке. Написал safe. Результат
ЯПВремя мсС++6047unsafe C#5943safe C#5196
Вот такая интересная картина. Рихтер писал: если компилятор видит что счетчик цикла не может выйти за границы массива, то внутри проверки границ не делаются.
Исходник safe C#
Код: 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.
		static void TestBubble2() {
            var buf = new int[SIZE];
            for (int i = 0; i < SIZE; i++)
                buf[i] = SIZE - i;

            Console.WriteLine("Started...");
            Stopwatch sw = new Stopwatch();
            sw.Start();

			for(int i = 0; i < buf.Length; i++) {
				for(int j = 1; j < buf.Length - i; j++) {
					if(buf[j-1] > buf[j]) {
						int t = buf[j-1];
						buf[j-1] = buf[j];
						buf[j] = t;
					}
				}
			}

            int elapsed = (int)sw.Elapsed.TotalMilliseconds;

			for (int i = 1; i < buf.Length; i++) {
				if(buf[i-1] > buf[i]) {
					Console.WriteLine("ERROR");
					break;
				}
			}

            Console.WriteLine("Elapsed: " + elapsed.ToString() + " miliseconds");
		}


PS На С++ улучшить время не получилось.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458162
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВAR®,
не знаю что там клок делает, но sw то тормазни перед Console.WriteLine
clock() в виндовсе дает время с момента старта проги в мс.
sw.Stop() на замер не влияет.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458344
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TРихтер писал: если компилятор видит что счетчик цикла не может выйти за границы массива, то внутри проверки границ не делаются.Я тоже про это где-то читал, но тогда на практике у меня это не подтвердилось. Возможно с тех пор что-то поменялось.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458414
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня результаты удивили. Как safe C# обогнал unsafe и С++ почти на 15%! Это уже не погрешность измерения. Проц i7-6700K

Продолжил исследования, запустил тесты на других компах:
i7-3770K все три варианта дали примерно одно и тоже, разброс <1%.
i3-2310M C++ чуть вперед вырвался

exe одни и те же, в архиве вместе с исходниками.

Какие выводы сделать даже не знаю. MS затачивает компилятор под свежие процы? Интел затачивает процы под .Net? Что еще проверить?
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458448
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Started C# safe...
Elapsed: 6608 miliseconds
Started C# unsafe...
Elapsed: 6560 miliseconds

C:\Users\Roman\Downloads\test>cpp
Started C++ pointer...
Elapsed: 6578 miliseconds
Started C++ array...
Elapsed: 6609 miliseconds
у меня Intel Core i7-3770 @ 3,4 GHz
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458571
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На i7-3770K у меня похожая картина. Разбег <1%, т.е. примерно одинаково.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Started C# safe...
Elapsed: 6647 miliseconds
Started C# unsafe...
Elapsed: 6649 miliseconds

Started C++ pointer...
Elapsed: 6625 miliseconds
Started C++ array...
Elapsed: 6593 miliseconds

Непонятный реультат на i7-6700K
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Started C# safe...
Elapsed:  5013  miliseconds
Started C# unsafe...
Elapsed: 5760 miliseconds

Started C++ pointer...
Elapsed: 5828 miliseconds
Started C++ array...
Elapsed: 5844 miliseconds
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458638
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Какие выводы сделать даже не знаю. MS затачивает компилятор под свежие процы? Интел затачивает процы под .Net? Что еще проверить?
Посмотри полученный машинный код. jit создает код в зависимости от имеющегося проца, С++ имеет 100500 флагов компиляции.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458681
AR®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМеня результаты удивили. ... Какие выводы сделать даже не знаю.
Что же тогда удивительного в моих результатах с C++ из VS2010?

Dima TMS затачивает компилятор под свежие процы?
Я этого не исключаю © :).

В Ваших результатах меня удивило, что мой другой вариант тела цикла привёл на C++ к улучшению (пусть и не очень большому), а на C# - к ухудшению. У меня с ним хуже и там, и там.
Видимо, за C++ серьёзно "взялись" к выпуску VS2015.
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458737
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКакие выводы сделать даже не знаю.
Выводы нижно делать правилные: Даже код для time-critical приложений можно писать на С#.
Суть в том что промежуточный байткод может быть оттранслирован в оптималный машинный код для конкретного процессора. С нативным машинным кодом такого фокуса уже не получится.

Читать
...
Рейтинг: 0 / 0
Максимальный размер ConcurrentDictionary в 32-битных приложениях
    #39458765
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronDima TКакие выводы сделать даже не знаю.
Выводы нижно делать правилные: Даже код для time-critical приложений можно писать на С#.
Суть в том что промежуточный байткод может быть оттранслирован в оптималный машинный код для конкретного процессора. С нативным машинным кодом такого фокуса уже не получится.

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


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