sort-research-rs README

The project's README from github.com/Voultapher/sort-research-rs. As one markdown file: README.md.

sort-research-rs

This repository contains:

Most tests and benchmarks can be applied to non Rust implementations. This works by implementing the 5 benchmark types as #[repr(C)] and having a defined C API that can be implemented, wrapping the C/C++ sorts.

Most functionality is by default disabled via cargo features, see the Cargo.toml. Some functionality can be enabled or switched by setting environment variables. See for example benches/bench.rs.

Research results

Running the tests

cargo test

cargo miri test

# Might require disabling criterion dependency.
RUSTFLAGS=-Zsanitizer=address cargo t --release

Running the benchmarks

cargo bench

cargo bench <sort_name>-<prediction_state>-<type>-<pattern>-<size>

# Example
cargo bench rust_std_stable-hot-u64-random-10000
cargo bench hot-u64-random-10000
cargo bench random

You can also set a custom regex to filter the benchmarks you want to run:

BENCH_REGEX="std.*i32-random-8$" cargo bench

If you want to collect a set of results that can then later be used to create graphs, you can use the run_benchmarks.py utility script:

# Will write results to my_test_zen3.json
BENCH_REGEX="_stable.*random-" python util/run_benchmarks.py my_test_zen3

To run the graph_all.py script to create graphs from this data you need to first install the dependencies as specified in requirements.txt e.g. on Linux:

python -m venv venv
source ./venv/bin/active
pip install --requirement util/graph_bench_result/requirements.txt

Afterwards, you can use the graph_all.py script:

python util/graph_bench_result/graph_all.py my_test_zen3.json

Fuzzing

You'll need to install cargo fuzz and cargo afl respectively. See https://rust-fuzz.github.io/book/introduction.html.

Fuzzing with libfuzzer

cd fuzz
cargo fuzz run libfuzzer_main

Fuzzing with afl

cd fuzz-afl
RUSTFLAGS=-Zsanitizer=address cargo afl build --release && cargo afl fuzz -i in -o out -D target/release/afl

Adjust fuzz/fuzz_targets/libfuzzer_main.rs and fuzz/fuzz_targets/libfuzzer_main.rs respectively to change the fuzz target. Default rust_ipn_stable.

Contributing

Please respect the CODE_OF_CONDUCT.md when contributing.

Adding a new sort implementation

Please open an issue before investing the effort of adding a new sort implementation. The maintainer of this project is currently not interested in building an up-to-date database of all existing sort implementations. Implementations are added based on situational context and relevance to the maintainers' goals. Baseline for all new sort implementations is they must pass all functionality tests, they may pass the safety tests but don't have to.

Authors

See also the list of contributors who participated in this project.

License

This project is licensed under the Apache License, Version 2.0 - see the LICENSE.md file for details.

sort-research-rs (Voultapher/sort-research-rs)

Searching Database…

Что это такое?Набор тестов, бенчмарков и фаззинга для реализаций сортировок, написанный на Rust. Здесь же живёт новая сортировка ipnsort, vendored-копии сортировок на Rust, C++ и C для сравнения, а также итоговые научные статьи.
Это библиотека, которую я подключу к своему проекту, или отдельный набор утилит?Отдельный исследовательский набор из крейтов с тестами и бенчмарками: репозиторий клонируют и запускают через cargo, а не подключают как зависимость. Реализации сортировок на Rust, C++ и C лежат внутри (vendored) для сравнения.
Как запустить тесты и бенчмарки?Клонируйте репозиторий и используйте cargo: он запускает и набор тестов, и набор бенчмарков, а можно передать свой regex, чтобы отфильтровать, какие бенчмарки выполнять.
Что должно быть установлено?Rust с cargo для основного набора; cargo fuzz и cargo afl для фаззинга; Python с зависимостями из requirements.txt, если хотите строить графики по собранным результатам.
На что обратить внимание при запуске?Большая часть функциональности по умолчанию выключена через cargo-фичи — загляните в Cargo.toml, чтобы включить нужное, — а некоторые параметры задаются переменными окружения, например в benches/bench.rs.
Для кого это — для тех, кто пишет сортировки, или для обычных Rust-разработчиков?В основном для авторов сортировок и исследователей производительности: набор проверяет свойства корректности, которые редко гарантируют, и гоняет бенчмарки на разных типах, паттернах и размерах — полезно, когда вы пишете или оцениваете саму сортировку.
Он может тестировать и замерять сортировки на C и C++, или только на Rust?Большинство тестов и бенчмарков работают с нерастовскими реализациями: типы для бенчмарков представлены как #[repr(C)] с определённым C API, который вы реализуете, чтобы обернуть свою сортировку на C или C++, как в vendored-версии cpppdqsort.
Что такое ipnsort?ipnsort (Instruction-Parallel-Network-Sort) — новая сортировка, разработанная в этом репозитории: эффективная, универсальная и устойчивая к плохим входным данным нестабильная сортировка. Из тех же исследований вышла driftsort — стабильный аналог.
Какие результаты дало исследование?Результаты опубликованы в виде статей: о неожиданной эффективности современных алгоритмов сортировки, о новой реализации branchless-разбиения, кейс-стади Safety vs Performance для сортировок на C, C++ и Rust, а также анализы производительности x86-simd-sort от Intel (AVX-512) и glidesort/ipnstable.
Умеет ли он строить графики по результатам бенчмарков?Да: runbenchmarks.py собирает наборы результатов, а graphall.py строит по ним графики — сначала установите Python-зависимости из requirements.txt.
Creator
Voultapher
Size
76.5 MB
Stars
546
Updated
CommitMar 02
Age
4y
Commits · 90 Days