powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Межпроцессное взаимодействие - что быстрее?
25 сообщений из 109, страница 4 из 5
Межпроцессное взаимодействие - что быстрее?
    #39625225
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton13thЯ, вообще-то чутка подшаманил, и разогнал до 242К/сек. (1 клиент) и 143К/сек. (5 клиентов). На стандартных виндовых Event-ах.
Топик можно закрывать? :)
Пусть поваляется. Напишу потом результат сравнения с сокетами и ZMQ.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39625267
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39625331
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thЯ, вообще-то чутка подшаманил, и разогнал до 242К/сек. (1 клиент) и 143К/сек. (5 клиентов). На стандартных виндовых Event-ах.Стоит показать в чём шаманство для тех кто найдёт топик. Результат хоть глобально и печальный, но локально очень неплох.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39625348
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю что автора ограничивает соглашение о неразглашении.

Но если бы у нас был макет - это бы придало Топику некоторую динамику.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39625545
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пожалуйста, вот макет.
Рабочая конфигурация - Release x64, на других не пробовал.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39625551
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для удобства сервер сам запускает клиентов. Что бы это работало, в PROJECT_PLACE впишите каталог солюшена.
В WORK_CLIENTS_COUNT впишите желаемое число клиентов (но не больше MAX_CLIENTS_COUNT). Это макет, я не заморачивался, что бы всё было удобно.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39630121
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья. Автор выложил сорцы. От нас нет ответа. Почему такая пассивность?
Мы все давали наперебой советы. Кто-то просмотрел код? Есть code review issues?
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39630822
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Мы все ушли в Телеграмм...
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39630830
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmayton,

Мы все ушли в Телеграмм...

Все заняты настройкой VPN и анамайзеров для обхода блокировки Телеграмма? )))
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39630844
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, вот еще... Занафига? Им проще не пользоваться.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39630846
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmayton,

Мы все ушли в Телеграмм...и теперь выйти из него не можем)
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39630864
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цикл писателя:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
	for (size_t i = 0; i < uCount; i++)
	{
		data.nNumber = (int)i; // Формируем сообщение
		memmap.Write(&data, sizeof(SData));
		//Sleep(1000);
		if (i % uMarkDivider == 0)
			wcout << '.';

		for (size_t j = 0; j < WORK_CLIENTS_COUNT; j++) // Будим всех читателей
			SetEvent(hWriterEvents[j]);

		WaitForMultipleObjects(WORK_CLIENTS_COUNT, hReaderEvents, true, INFINITE); // Ждем пока все прочитают

		for (size_t j = 0; j < WORK_CLIENTS_COUNT; j++) 
			ResetEvent(hReaderEvents[j]);
	}


Этот код будет работать со скоростью самого медленного читателя.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39630895
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решение на первой странице написали 21300756
Anatoly MoskovskyКак выше уже написали здесь проблема в том что нет очереди.
Как только появляется очередь, то сигналы можно слать уже не на каждое сообщение, а только если очередь пуста/полна (а тогда и так одна из сторон простаивает и скорость сигналов не важна). А в промежутках между этим применяется обычный мьютекс.
Я в такой конфигурации получал не то что сотни тысяч - а даже миллионы в сек.
Но ТС похоже так и не понял как очередь добавить в его код.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39630922
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devLeonid Kudryavtsev, вот еще... Занафига? Им проще не пользоваться.

Он потрясающе удобен. Не знаю даже чем. Но удобен.
Кроме этого, там весь траффик. Там все люди.
Вебы сдохли.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39631297
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thНу вот, взял такой:
Сделал memory-mapped файл, пишу в него, делаю Set эвенту, в клиенте читаю. Размер структуры - тривиальный, 8 байт.
Получается 20 тысяч в секунду. Процессор i5-4440. До сотен тысяч далеко.
Затестил твой код 21311921 на своем i5-660. Процы похожие
Кол-во читателей Скорость тыс./сек11973143594
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39631308
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... есть в этих эвентах какая-то натяжка. А мы можем хотя-бы снизить их количество?
Ну чтоб не на каждый месседж был эвент.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39631316
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivrdb_devLeonid Kudryavtsev, вот еще... Занафига? Им проще не пользоваться.

Он потрясающе удобен. Не знаю даже чем. Но удобен.
Кроме этого, там весь траффик. Там все люди.
Вебы сдохли.Ну не знаю... Не пользуюсь ни viber'ом, ни whazzup'ом совсем, а скайпом пару раз в месяц. Разве что корпоративным jabber'ом регулярно.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39631318
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonХм... есть в этих эвентах какая-то натяжка. А мы можем хотя-бы снизить их количество?
Ну чтоб не на каждый месседж был эвент.
Можно, но не поможет особо.
Я хотел показать что проблема вовсе не в эвентах. ТЗ:
13thНадо передавать 300..500 сообщений В СЕКУНДУ.
Всего. Даже при такой убогой передаче сами расходы на передачу займут 0.25-0.5% времени.
Тут хоть затюнингуйся - экономить особо не на чем. Тормоза у него в коде его читателей, поэтому надо схему чтения менять. Т.е. добавлять очередь, чтобы читатели не синхронно читали.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39631797
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonХм... есть в этих эвентах какая-то натяжка. А мы можем хотя-бы снизить их количество?
Ну чтоб не на каждый месседж был эвент.
Там по два эвента на каждого читателя.

Думал можно сделать два эвента + счетчик, но не придумал как. Cделал два эвента + биткарта, т.е. 32/64 читателя максимум.

Скорость не сильно поменялась
Кол-во читателей Скорость тыс./сек Мой вариант тыс./сек11972013143150594117
Но к моему проще очередь прикрутить. Хотя тоже не все так просто, т.к. тут одно и тоже сообщение несколько читателей обрабатывают.
ИсходникСборка в TestMapped.exe, т.к. запускает сам себя для чтения
Код: 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.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
#include <windows.h>
#include <stdint.h>
#include <stdio.h>
#include <assert.h>

#define READER_COUNT 3
#define MESSAGE_COUNT 1000000

//*******************************************************************
//* SHARED DATA *****************************************************
//*******************************************************************

struct data_t {
	volatile int number;
	volatile long need_read;
};
#pragma data_seg("Shared")
data_t shared_data = { 0 };
#pragma data_seg()
#pragma comment(linker, "/SECTION:Shared,RWS")

//*******************************************************************
//* WRITER **********************************************************
//*******************************************************************

void writer() {
	HANDLE reader_event = OpenEvent(EVENT_ALL_ACCESS, false, "SharedMemoryReader");
	HANDLE writer_event = OpenEvent(EVENT_ALL_ACCESS, false, "SharedMemoryWriter");
	assert(reader_event != NULL && writer_event != NULL);
	long init_mask = (1 << READER_COUNT) - 1;
	printf("test: % d msg  %d readers\n", MESSAGE_COUNT, READER_COUNT);
	uint32_t t = GetTickCount();
	// Отправка сообщений
	while(shared_data.number != 0) {
		shared_data.number--; // Заполнение сообщения

		shared_data.need_read = init_mask; // Маска списка читателей

		SetEvent(reader_event); // Пробуждение читателей
		WaitForSingleObject(writer_event, INFINITE); // Ожидание завершения чтения
	}
	CloseHandle(writer_event);
	CloseHandle(reader_event);
	uint32_t time = GetTickCount() - t;
	printf("time %d msec  speed %d msg/sec\n", time, MESSAGE_COUNT * 1000 / (time == 0 ? 1 : time));
}

//*******************************************************************
//* READER **********************************************************
//*******************************************************************
void start_readers() {
	shared_data.number = MESSAGE_COUNT;
	HANDLE reader_event = CreateEvent(NULL, true, false, "SharedMemoryReader");
	HANDLE writer_event = CreateEvent(NULL, false, false, "SharedMemoryWriter");
	assert(reader_event != NULL && writer_event != NULL);
	// Запуск читателей
	for (size_t i = 0; i != READER_COUNT; i++) {
		STARTUPINFO si = { sizeof(si) };
		PROCESS_INFORMATION pi;
		char buf[1024];
		sprintf_s(buf, sizeof(buf), "TestMapped.exe %d", i);
		printf("run: %s\n", buf);
		CreateProcess(NULL, buf, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
		CloseHandle(pi.hThread);
		CloseHandle(pi.hProcess);
	}
	Sleep(500);
	CloseHandle(writer_event);
	CloseHandle(reader_event);
}

// Прием сообщений
void reader(char *name) {
	long num = atoi(name);
	printf("reader#%d start ...\n", num);
	HANDLE reader_event = OpenEvent(EVENT_ALL_ACCESS, false, "SharedMemoryReader");
	HANDLE writer_event = OpenEvent(EVENT_ALL_ACCESS, false, "SharedMemoryWriter");
	assert(reader_event != NULL && writer_event != NULL);
	int64_t sum = 0;
	long mask = 1 << num, not_mask = ~mask;
	while(shared_data.number != 0) { // Последнее сообщение 0
		WaitForSingleObject(reader_event, INFINITE); // Ожидание заполнения сообщения

		if((shared_data.need_read & mask) == 0) {
			// Это сообщение уже обработано
			if(shared_data.need_read != 0) SwitchToThread();
			continue;
		}

		// Обработка сообщения
		sum += shared_data.number;

		// Снятие флага обработки
		long old;
		do {
			old = shared_data.need_read;
		} while (InterlockedCompareExchange(&shared_data.need_read, old & not_mask, old) != old);
		if (old == mask) {
			// Закончил последний читатель
			ResetEvent(reader_event);
			SetEvent(writer_event);
		}
	}
	SetEvent(writer_event);
	CloseHandle(writer_event);
	CloseHandle(reader_event);
	printf("sum = %lld\n", sum);
}

//*******************************************************************
int main(int argc, char **argv) {
	if(argc > 1) {
		reader(argv[1]);
	} else {
		start_readers();
		writer();
	}
	system("pause");
}

...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39631820
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tодно и тоже сообщение несколько читателей обрабатывают.
Это не масштабируется.
У каждого читателя должна быть выделенная синхронизирующая структура для передачи сообщения. А писатель делает копии каждому.
Неважно очередью передается или одним экземпляром.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39631893
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TЭтот код будет работать со скоростью самого медленного читателя.
В данном случае у меня тривиальный читатель: memcpy плюс SetEvent. Меньше не будет никак. Поэтому самые быстрые реальные читатели не обгонят этого, тривиального.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39631917
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thВ данном случае у меня тривиальный читатель: memcpy плюс SetEvent.

Это на один SetEvent больше, чем необходимо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39632035
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thDima TЭтот код будет работать со скоростью самого медленного читателя.
В данном случае у меня тривиальный читатель: memcpy плюс SetEvent. Меньше не будет никак. Поэтому самые быстрые реальные читатели не обгонят этого, тривиального.
Тогда 10000+ сообщений в секунду гарантированно.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39754389
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте в качестве пятничной темы. Рассмотрим memory-map (mmap). В качестве points:

1) Размер страницы? Везде-ли 4к?
2) Ограничения. Сколько можно выделить.
3) Реализации в Windows/Unix
4) Практическое применение кроме традиционного (загрузка кода). SQLite? Другие DBMS?
5) Бенчмарки. Оптимизации.

Пока - предложения по вопросам. А топик я форкну отдельно.
...
Рейтинг: 0 / 0
Межпроцессное взаимодействие - что быстрее?
    #39754417
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

а конструктивно что предлагаешь обсуждать, реализацию базы типа ключ-значение (т.е. ассоциативного массива)?
межпроцессная очередь как видно в силу ограничений ОС на отклик, совсем несостоятельная
...
Рейтинг: 0 / 0
25 сообщений из 109, страница 4 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Межпроцессное взаимодействие - что быстрее?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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