LINUX.ORG.RU

t1ha (Fast Positive Hash) реализован на Rust

 , , t1ha


1

5

Flier Lu переложил реализацию t1ha (Fast Positive Hash) на Rust.

Библиотека t1ha предоставляет несколько предельно быстрых переносимых хэш-функций (в тестах опережает StadtX, xxHash, mum-hash, metro-hash, CityHash и т.д.).

Проект на Rust интересен тем, что реализация достаточно тщательная. Поэтому внутри можно подсмотреть, как из C/C++ на Rust перекладываются связанные с производительностью трюки.

Репозиторий на GitHub

Перемещено jollheef из opensource

anonymous

Последнее исправление: Virtuos86 (всего исправлений: 2)

Тем не менее, это очень неплохой результат (в частности недостижимый для Java).

Стоп, видать я отстал от жизни. Имелось ввиду gcj что ли ? Когда жаву транслируют в си а потом собирают ?

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

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

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

Стоп, видать я отстал от жизни. Имелось ввиду gcj что ли ? Когда жаву транслируют в си а потом собирают ?

У джавы экзестенциальные проблемы с uint64_t. Поэтому либо через JNI, либо через гипотетическое расширение «Critical Natives».

Подробно писал об этом здесь в другом сообщении.

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

Упс, s/экзестенциальные/экзистенциальные/

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

Болезный, ты о какой программе говоришь?

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

Может, осилишь уже русский язык хотя бы на уровне школьника?

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

И как я понимаю, он становится все более и более адским

Наоборот, с течение времени они поправили жуткие futures на что-то человеческое.

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

И что в синтаксисе раста препятствует кодревью?

Это я к тому, что «синтаксис это последнее дело в языке». Ни разу не последнее. Адекватный, простой и читаемый синтаксис и coding style — очень важные компоненты надежной системы QA.

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

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

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

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

Ну вот я работал с чуваками, которые так писали на C, что хотелось вены вскрыть. Потому что просто ни разу не понятно, что хотел сказать автор, без анальных карнавалов с cscope. В итоге, когда мы поменяли процесс и уволили самых упертых, стало гораздо меньше багов.

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

звучит логично. не разбирался что из себя представляет bigint в js, честно говря ожидал чего посерьезнее.

оффтоп:
почему ты называешь js производным от явы? я не защищаю его, (не ненавижу, просто нелюблю - это необходимое зло). но обьективно - эти языки ведь никак не связаны кроме названия (и желания словить хайп на нем ибо в те времена ява была в тренде). и даже если изначально ява оказала влияние на синтаксис - они всеравно имеют предельно мало общего. более того современный жс сильно, СИЛЬНО отличается от изначальных реализаций и не только синтаксическим сахором.

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

Имелась ввиду обычная Java.

GCJ, кстати, давным-давно был заброшен и года два-три назад его удалили из состава GCC. Ну это и понятно, он вроде как даже в Java 1.2 не смог до конца.

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

Ну вот я работал с чуваками, которые так писали на C, что хотелось вены вскрыть.

Я думаю, на каждом языке найдутся такие люди. :) Тоже знаю много упёртых. Синтаксис языка разобраться с этими людьми не помог.

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

Я думаю, на каждом языке найдутся такие люди. :) Тоже знаю много упёртых. Синтаксис языка разобраться с этими людьми не помог.

Суть в том, что между стилем написания кода и количеством пойманных на ревью (и при написании) багов была прямая корреляция. Чем проще его читать, тем меньше логических ошибок ты допустишь.

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

Да, но только проблема в том, что стиль написания слабо коррелирует с синтаксисом, хотя какая-то зависимость, конечно же, присутствует.

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

Шустрее и безопаснее.

С++ быстрее.

Еще замечу, что с помощью rust нужно писать программы так, чтобы компилятор (точнее borrow checker) поверил, что вы не делаете ничего плохого с памятью (или с ресурсами в целом). Часто это работает как надо, но иногда приходится писать код в несколько хитрой форме только для того, что бы удовлетворить условиям borrow checker'а.

В Rust нет классов, но есть типажи, на основе которых можно построить объектно ориентированную программу. Но скопировать реализацию с полиморфными классами в C++ в язык Rust напрямую не получиться.

Rust достаточно молод. Мало полезного материала в сети, на StackOverflow. Мало хороших библиотек. Например, нет библиотек для построения GUI, нет портов wxWidgets, Qt.

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

Круть но я писал MBR boot с выводом текста меньше 512 байт.

Угу, только в данном случае потроха Эльфа пожирают основное место.

Башка Эльфа     - 64 байта
Башка программы - 56 байт  (4+4 + 8+8+8+8+8+8)
Секция текст    - 64 байта (4+4 + 8+8+8+8 + 4+4 + 8+8)
Секция данных   - 64 байта
---------------------------
                 248 байт


# Хотя по идее секции можно вырезать. Короче пох.


строка "Hello, world\n" - 13 байт
указатель на строку     -  8 байт (hw(%rsi))
размер строки           -  8 байт ($hs)
указатель на функцию    -  8 байт (write)
указатель на функцию    -  8 байт (exit)
-------------------------------------------------
                          45

константы

$1                      - 8 байт (movq $1, %rax)
$1                      - 8 байт (movq $1, %rdi)
$60                     - 8 байт (movq $60, %rax)
-------------------------------------------------
                         24

(никто ведь не говорил, что это не int64_t)

И 12 инструкций, неизвестной мне длины. Если
предположить, что каждая по 8 байт, то +12*8
                       
Итого 413 байт. И, вероятно, ещё выравнивание
повсюду.

Там до 528 не далеко.

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

Чем rust лучше c++?

Шустрее и безопаснее.

С++ быстрее.

Вы измеряете качество генерации кода существующими компиляторами или сферическими компиляторами в вакууме?

Если первое, то сравнение не имеет смысла, потому что вы сравниваете LLVM с GCC и контекст языков тут не имеет смысла.

Если второе, то их скорость равна +- погрешность, источником которой является таки человеческий фактор. Для Rust это означает, что ответственность ложится на плечи тех, кто строит безопасные абстракции, а для C++ - на всех.

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

Это действительно местный сумасшедший, он весь полезный контент для своего поста украл из https://habr.com/ru/post/344282/:

Что плохого и хорошего в Rust

[skipped]

- Нужно писать программы так, чтобы компилятор (точнее borrow checker) поверил, что вы не делаете ничего плохого с памятью (или с ресурсами в целом). Часто это работает как надо, но иногда приходится писать код в несколько хитрой форме только для того, что бы удовлетворить условиям borrow checker'а.

- В Rust нет классов, но есть типажи, на основе которых можно построить объектно ориентированную программу. Но скопировать реализацию с полиморфными классами в C++ в язык Rust напрямую не получиться.

- Rust достаточно молод. Мало полезного материала в сети, на StackOverflow. Мало хороших библиотек. Например, нет библиотек для построения GUI, нет портов wxWidgets, Qt.

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

И? Как это опровергает смысл моего вышесказанного?

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

Чем rust лучше c++?

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

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

Если что - это моё скромное мнение. Я пока еще нубас в расте. Впрочем после старичка С++ всё что угодно зайдет. Вот только по тем или иным причинам в сфере моих интересов всё кроме раста мною отмелось...

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

С++ быстрее.

По тестам https://benchmarksgame-team.pages.debian.net/benchmarksgame/faster/rust-gpp.html Rust выигрывает в 5 тестах у С++, в 2 тестах примерно одинаково, и только в 3 выигрывает С++.

Еще замечу, что с помощью rust нужно писать программы так, чтобы компилятор (точнее borrow checker) поверил, что вы не делаете ничего плохого с памятью (или с ресурсами в целом). Часто это работает как надо, но иногда приходится писать код в несколько хитрой форме только для того, что бы удовлетворить условиям borrow checker'а.

Это скорее плюс языка чем минус. Времени затратил побольше, зато и код будет лучше.

Например, нет библиотек для построения GUI, нет портов wxWidgets, Qt.

Не всем нужен GUI.

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

Мало хороших библиотек

Пробовал я язык crystall, так на нём еще хуже с библиотеками. И это, он вообще виндовз не поддерживает.

нет библиотек для построения GUI

есть Gtk и вроде бы биндинг не плох. В то же время биндить С++ либы я б не советовал, так как разрабы С++ болт клали на желающих побиндить в классы.

скопировать реализацию с полиморфными классами в C++ в язык Rust напрямую не получиться.

Поидее можно позаворачивать всё в боксы типа Arc, в тяжелых случаях добавить unsafe, но получится сложно и бессмысленно переписывать.

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

Вообще то про то что Ява не совсем компилятор и требовать от нее скорости компилятора как то неправильно.

Сравните хотя бы с ГО.

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

У явы есть jit, от которого в принципе можно требовать больших скоростей, чем от компилятора в определенных условиях. А еще говорят, что аллокация мелких объектов у JVM работает быстрее, чем new в плюсах.

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

За счёт памяти, я не про то что быстрее и медленнее я про то что сравнивать не совсем правильно, так можно докатился и сравнить питон у него ведь тоже байт-код.

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

Байткод есть только на диске. В памяти со временем образуется уже прямой машинный код. А вот питон так не умеет

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

Спасибо за ссылку.

Не всем нужен GUI.

Согласен. Это был только пример.

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

звучит логично. не разбирался что из себя представляет bigint в js, честно говря ожидал чего посерьезнее.

BitInt - это просто целые числа переменной/динамической разрядности. Класс бинарных строк, для которых реализованы операции алгебры целых чисел.

Посредством BitInt в JS или через BigInteger в Java можно выполнить нужные для t1ha вычисления. Это будет работать, просто медленнее.

оффтоп:
почему ты называешь js производным от явы? я не защищаю его, (не ненавижу, просто нелюблю - это необходимое зло). но обьективно - эти языки ведь никак не связаны кроме названия (и желания словить хайп на нем ибо в те времена ява была в тренде). и даже если изначально ява оказала влияние на синтаксис - они всеравно имеют предельно мало общего. более того современный жс сильно, СИЛЬНО отличается от изначальных реализаций и не только синтаксическим сахором.

Мне всегда хочется потроллить - если JS не производная Java, то почему торговой маркой «JavaScript» владеет Oracle? :)

Если серьезно, то всё вышесказанное сложно оспаривать. Тем не менее, у JS общая «идейная беда» с Java = поместить (с благими намерениями) пользователя-программиста в плюшевую виртуальную среду, а потом героически бороться с последствиями.

Например, возвращаясь к обсуждаемой теме, в Java отсутствует unsigned integer, а в JS «обычный» integer имеет 52 бита и в «военное время» может становиться float point number. Это вполне рациональное и удобное упрощение для массы случаев, но не соотносящееся с тем что на самом делает любой реальный процессор.

Вот в этом ключе заражения «идеей виртуальной плюшевости» Java можно назвать мамой JS. Как-то так.

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

«идеей виртуальной плюшевости»

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

js производным от явы

По мне так между ними общее только родство синтаксиса с С++. Особенно учитывая то, что js поднабрался прототипов из смолтолка.

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

наверно буду изучать.

Главное подходить к процессу спокойно, созерцательно. Раст не из тех языков, которые стараются понравиться кодеру, так что набрасыватся на него с готовым видением своей программы не стоит. Следует позволить компилятору поправлять свое мышление и в итоге станет видно, что результат совместных усилий вполне себе неплох. Полезный опыт так сказать. Врочем то же самое можно сказать о лиспах, фортах и прочих необычных языках.

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

Врочем то же самое можно сказать о лиспах, фортах и прочих необычных языках.

Да в них могут полтора фрика, больше никому это не нужно. Как следствие - скудная стандартная библиотека, и скудный набор сторонних библиотек.

Если язык не годится для промышленного программирования, то ситуация и не изменится. Т.к. основную массу кода добавляют не энтузиасты, а работяги, которые либо делаю код за плату, либо за репутацию, чтобы потом делать кэш на этом языке.

Начинать изучение языка стоит не с того, какой он прикольный, а с того, для чего он годиться лучше чем существующие альтернативы. И если не для чего, то значит и не нужно. Пусть кто-то другой тащит эту ношу на своём горбу. Иначе это ни чем не отличается от секты Свидетелй Раста Благословенного.

Ну так для чего же Раст годится лучше всего?

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

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

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

Меня ещё прут синтаксические бонусы вроде конструкций-выражений. Можно делать в стиле:

let a = if smth { ... } else { ... };

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