LINUX.ORG.RU

Racket быстрее для многопоточной работы, чем Go

 , ,


5

6

Микрозамер скорости сервера эха: https://racket.discourse.group/t/racket-matching-or-exceeding-golang-for-echo-server-performance/660

Результаты:

Racket: ~114,584 сообщений/сек
Go (default): ~85,650 сообщений/сек
Go (GOMAXPROCS=1): ~108,495 сообщений/сек

Код для Racket (ссылка) использует потоки Racket (thread), код для Go (ссылка) использует горутины.

★★★★★
Ответ на: комментарий от ugoday

На что уходят десятки мегабайт памяти неизвестно.

Хэтэтэпэ в стандартной либе Но весит 36 метров, если не ошибаюсь. У Вас ограничение в 50. А значит 14Мб.

Иф ю хомлесс, джаст бай а хаус.

anonymous
()
Ответ на: комментарий от anonymous

*Го, да будет проклят этот т9.

anonymous
()
Ответ на: комментарий от anonymous

Если тебе понравился хаскель, но ему ты предпочёл ракет, то как именно ты живёшь на ракете? Вот есть тайпед-ракет, но разве писать с типами на ракете принято? Вывод типов наверняка не такой крутой, да и в целом ml-style type system предоставляется даже не относительно известным typed racket, а вообще ещё одним ‘пакетом’ plait.

Принято. Многое написано на Typed Racket, в частности, практически вся стандартная библиотека.

Вывод типов наверняка не такой крутой

Вывод типов более крутой, так как в Haskell каждое значение может иметь только один тип, а в Typed Racket можно писать

(: f (-> (U (Listof Any) VectorTop) Integer))
(define (f x)
  (if (list? x) (length x) (vector-length x)))

В Haskell такой тип невозможен.

да и в целом ml-style type system предоставляется даже не относительно известным typed racket, а вообще ещё одним ‘пакетом’ plait

Plait совсем игрушечный. Аналогом Haskell скорее будет https://lexi-lambda.github.io/hackett/, но он тоже уже пару лет не обновляется.

Haskell хорош только в комплекте: система типов + ленивость + синтаксис. Выкидываешь хотя бы одно и теряется почти весь смысл.

Насколько оно взаимозаменяемо? С точки зрения экспириенса от написания.

Разные методики обобщения кода. Haskell поощряет писать через цепочки операторов. Racket поощряет писать параметризуемые конструкции. То есть, если в Haskell sortBy (compare `on` fst) x, то в Racket (sort x #key fst).

На Racket результат получается быстрее, но на Haskell он сразу получается красивым (с короткими обобщёнными функциями).

Соответственно, для консоли пишу на Haskell, а для GUI – на Racket.

есть скрытая пресуппозиция, что кроме инфраструктуры и всяких минорных вещей, они схожи

Для меня они схожи. Оба содержат достаточный набор примитивов в виртуальной машине (зелёные потоки, эфемероны, продолжения, …). Оба содержат достаточно мощные средства, чтобы минимизировать шаблонный код (макросы в Racket, эффективный синтаксис в Haskell). Оба не навязывают ООП. Haskell красивее и быстрее, но у Racket лучше инфраструктура.

monk ★★★★★
() автор топика

А разве «шокирующие» откровения подобного вида еще интересуют кого-нибудь адекватного? Ну да, все тут же побежали рэкет изучать 🤣.

Virtuos86 ★★★★★
()
Ответ на: комментарий от monk

Так я на все теги с ЯП подписан, что знаю :D, конечно, я пришел. Не про линупс же читать на ЛОР столько лет, в самом деле.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Не про линупс же читать на ЛОР столько лет, в самом деле.

Не про ляпнус же читать на ЛОР столько лет, в самом деле.

anonymous
()
Ответ на: комментарий от Virtuos86

Вот и ещё полтора десятка человек пришли. Обсудить Go, опять посмеяться над скобочками. В комментариях задали несколько осмысленных вопросов. «Шокирующие» откровения нужны, чтобы не писать темы вида «А давайте поговорим про Racket и сравним его с Go».

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

не писать темы вида «А давайте поговорим про Racket и сравним его с Go»

в такие темы прийдут те же самые люди с теми же самыми лопатами с тем же самым. но в принципе, я понял, что этот тред был bait'ом, поэтому принимается

Virtuos86 ★★★★★
()
Ответ на: комментарий от monk

Вот и ещё полтора десятка человек пришли.

@monk, использование метаданных легко решает все те вопросы ради которых изучают racket, haskell …
Подумайте почему …

anonymous
()
Ответ на: комментарий от anonymous

@monk, использование метаданных легко решает все те вопросы ради которых изучают racket, haskell …

Не решает. Это перпендикулярные наборы свойств.

Метаданные позволяю автоматизировать генерацию стандартных алгоритмов по структурам данных. Но метаданные не добавят в язык массовую многопоточность на зелёных потоках, не дадут синтаксических конструкций для наглядного описания нетривиального алгоритма, не дадут надёжного управления памятью.

Racket и Haskell удобны именно тем, что на верхнем уровне описания алгоритм можно описывать именно так, как он был бы описан на языке межчеловеческого общения. В результате практически не требуется писать дополнительную документацию, объясняющую, что должна делать программа.

И никто не мешает использовать метаданные в Racket и Haskell, объединяя их преимущества.

monk ★★★★★
() автор топика
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

не дадут синтаксических конструкций для наглядного описания нетривиального алгоритма

Например?

не дадут надёжного управления памятью.

А вот с метаданными то эти задачи решаются на раз.
У меня пока используется ресурсное дерево …

Нужно бы аллокатор сделать.
В отличие от иных аллокаторов он все знает о используемых данных и поэтому лучше сможет решить вопросы выделения и освобождения памяти.

И никто не мешает использовать метаданные в Racket и Haskell, объединяя их преимущества.

Ваше право.
Ранее вам привел пример API /400 строк всего/, которое позволяет проанализировать любой теговый формат представления данных, найти в нем общность и создать метаданные для работы с такими типами данных.

Да и метаданные это всего лишь одна из ступенек для разработки API, использующего базы знаний.

Хотите использовать racket, …

Non problem

Разрабатываемое API пригодно для работы 2D, 3D, мультимедия …

Как-то так!

А у вас даже с GUI проблемы …

anonymous
()
Ответ на: комментарий от anonymous

Например?

Haskell:

y f = f (y f)
fact = y (\f x -> if x == 0 then 1 else x * f (x-1))

Как метаданные дадут мне сделать анонимную рекурсивную функцию?

У меня пока используется ресурсное дерево …

Один ресурс может быть в разных структурах данных одновременно. Индексы, например, должны хранить ссылки на данные из коллекции, и удалять эти ссылки, когда данные из коллекции удаляются. При работе с графами вообще могут быть циклические ссылки. Хотя бы двусвязный список как на метаданных с ресурсным деревом сделаешь?

Ранее вам привел пример API /400 строк всего/, которое позволяет проанализировать любой теговый формат представления данных

Уже теговый. А то в предыдущем сообщении указывалось, что он gzip архив (xlsx) автоматически распознает…

А у вас даже с GUI проблемы …

В Racket? Никаких проблем. Переносимый, расширяемый, лаконичный.

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

@monk, прекращаю диалог.
У меня нет ни потребности ни желания, кому-либо, что-либо доказывать …

Владимир

anonymous
()
Ответ на: комментарий от ugoday

Я бы предпочёл не знать этого.

В общем, как оказалось не 36, а 3,6, даже меньше.

anonymous
()
Ответ на: комментарий от ugoday

Кто, я?

Да там работы на часик. Получить сигнал. Пнуть поды.

anonymous
()
Ответ на: комментарий от monk

Не обращай на него внимания, в какой-то больничке для шизиков забыли отключить интернет.

Minona ★★☆
()

Хм, какого-то заметного ускорения получить не удалось

package main

import (
	"io"
	"log"
	"net"
	"sync"

	reuse "github.com/libp2p/go-reuseport"
)

const buffSize = 32 * 1024

var buffsPool sync.Pool

func getBuf() (p []byte) {
	var ok bool
	if p, ok = buffsPool.Get().([]byte); ok {
		return // take from the pool
	}
	return make([]byte, buffSize) // create a new one
}

func putBuff(p []byte) {
	if len(p) != buffSize {
		return // ignore buffers with other size
	}
	buffsPool.Put(p) // put to the pool
}

func main() {
	const addr = "localhost:11777"

	var server, err = reuse.Listen("tcp", addr)
	if err != nil {
		log.Fatalln(err)
	}
	defer server.Close()

	log.Println("Server is running on:", addr)

	for {
		conn, err := server.Accept()
		if err != nil {
			log.Println("Failed to accept conn.", err)
			continue
		}

		go func(conn net.Conn) {
			defer func() {
				conn.Close()
			}()

			var p = getBuf()
			defer putBuff(p)

			io.CopyBuffer(conn, conn, p)
		}(conn)
	}
}

Но какой смысл в горутинах, если бомбят всего три клиента? Кол-во тредов Го выделяет равное кол-ву ядер. Значит если клиентов меньше чем ядер, то и горутины всего лишь ложаться на треды и всё.

anonymous
()
Ответ на: комментарий от anonymous

В Racket, если нужен reuse просто пишешь (tcp-listen port 4 #t). Если не нужен (tcp-listen port 4 #f). Всё штатно и переносимо.

monk ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Но какой смысл в горутинах, если бомбят всего три клиента?

Можешь сделать другой замер на горутинах. Я напишу эквивалент на Racket. Сравним. Разве что в Racket придётся количество ядер параметром давать.

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

@monk бесите меня уже … Нет в моем API подобных проблем.

Владимир

anonymous
()
Ответ на: комментарий от monk

У меня так и не получилось запараллелить futures, а в кложуре легко. Примеры не приведу, давно не использовал ни то, ни другое. Плотно присел в баш.

Hertz ★★★★★
()
Ответ на: комментарий от anonymous

Есть, надо дописать библиотеку, но после работы уже не стоит. А по кложуре даже есть реальный шанс на трудоустройство. Но я как разработчик очень слаб. Нужно практиковаться.

Hertz ★★★★★
()
Ответ на: комментарий от Hertz

У меня так и не получилось запараллелить futures

futures - это очень частный случай для очень ограниченного числа операций. Параллелить надо places.

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

@monk, на форуме два форумчанина подписывают посты как Владимир.
А вот темы постов СОВЕРШЕННО РАЗНЫЕ! …

Владимир

anonymous
()
Ответ на: комментарий от monk

Предлагаю обсудить мои разработки вне этого форума … В неформальной обстановке …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

на форуме два форумчанина подписывают посты как Владимир.

Как ты всех уже достал, идиот.

anonymous
()
Ответ на: комментарий от Virtuos86

@monk предупредил потому, что он парень не плохой.
А на остальные посты ни когда не отвечал, да и не буду.
Кто-то БЕСНУЕТСЯ, а в виноват?

Владимир

anonymous
()
Ответ на: комментарий от Virtuos86

Вы тоже неплохой парень… Будете моим парнем? Я разработаю вам АПИ

Владимир

anonymous
()
Ответ на: комментарий от monk

Хотя бы двусвязный список как на метаданных с ресурсным деревом сделаешь?

Core разрабатываемого API предоставляет все те возможности, которые имеет struct и МНОГО БОЛЕЕ.
Например: деревья, списки, … … … при этом любое поле или объект могут иметь Свойства; лексика, диапазоны, ссылки /любого типа/, … любой сложности.
Да использование индексов обыденно …, …, …

Поэтому обсуждение с вами многих вопросов БУКСУЕТ.
Например ссылка может быть и на объект на другом компьютере, … Поэтому вы правы, что многое не договариваю.

Ныне много сделано, но еще больше предстоит сделать.
Исходники выкладывать м не буду.
Это давно уже не поделка на коленке, а новая эффективная технология с новым объектно-ориентированным языком /а в нем фич ВАГОНЫ/…

Безусловно многое еще не реализовано.

Все же она пока еще не готова к публикации.

PS: Постараюсь больше не публиковать посты на эту тему.

На БАЗАРЕ о разработках не принято говорить.
Это не упрек именно ЛОР.
На форумах просто не ПРИЛИЧНО ГОВОРИТЬ О РАЗРАБОТКАХ.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

новым объектно-ориентированным языком

Владимир, вы создали еще один язык? На что похож синтаксис?

anonymous
()
Ответ на: комментарий от anonymous

Метаданные - наше всё.

Суть не в МЕТАДАННЫХ, а в том, что многие ВСЕ ЗНАЮТ, только вот не знают куда КОБЫЛУ ВПРЯГАТЬ В ТРАКТОР!

А я на вас и не обижаюсь! …

Что до многих других, то им нужна не СУТЬ, а ПОВОД …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

И я на вас не обижаюсь!

Владимир, вы как-то говорили о том, что хотели стать монахом.
Значит вы знаете, что означает термин «духовная война».
Ни кто не достигнет духовности угодной Господу без его помощи …
Не буду вам нотации читать.
Вы поняли о чем речь! …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Значит вы знаете, что означает термин «духовная война».

Да, Владимир. Мне не всегда удается противостоять легиону сами знаете кого …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Да, Владимир. Мне не всегда удается противостоять легиону сами знаете кого …

Обычный путь - ЕЖЕСЕКУНДНАЯ БОРЬБА.
По другому ни как.
Часто бывает и много горечи от козней бесов, но да радость Господь дарует часто.

НИ КОМУ ИСПЫТАНИЯ СВЕРХ ДУХОВНОЙ СИЛЫ ЧЕЛОВЕКА ГОСПОДЬ НЕ ПОПУСКАЕТ.  

Винить мы должны лишь себя …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Аминь, Владимир. Жаль, что большинство на этом форуме - безбожники и атеисты … Отсюда столько злобы.

Владимир

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.