Newer
Older
minerva / Tests / LibLocale / BenchmarkSegmenter.cpp
@minerva minerva on 13 Jul 1 KB Initial commit
/*
 * Copyright (c) 2024, Nico Weber <thakis@chromium.org>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include <LibLocale/Segmenter.h>
#include <LibTest/TestCase.h>

constexpr size_t N = 10'000;

static auto make_string()
{
    return MUST(String::repeated("hello "_string, N));
}

auto long_string = make_string();

BENCHMARK_CASE(for_each_boundary)
{
    Vector<size_t> boundaries;
    auto segmenter = Locale::Segmenter::create(Locale::SegmenterGranularity::Word);

    segmenter->for_each_boundary(long_string, [&](auto boundary) {
        boundaries.append(boundary);
        return IterationDecision::Continue;
    });

    EXPECT_EQ(boundaries.size(), 2 * N + 1);
}

BENCHMARK_CASE(forward)
{
    Vector<size_t> boundaries;
    auto segmenter = Locale::Segmenter::create(Locale::SegmenterGranularity::Word);
    segmenter->set_segmented_text(long_string);

    size_t boundary = 0;
    boundaries.append(boundary);
    while (true) {
        auto next_boundary = segmenter->next_boundary(boundary);
        if (!next_boundary.has_value())
            break;

        boundary = next_boundary.value();
        boundaries.append(boundary);
    }

    EXPECT_EQ(boundaries.size(), 2 * N + 1);
}

BENCHMARK_CASE(backward)
{
    Vector<size_t> boundaries;
    auto segmenter = Locale::Segmenter::create(Locale::SegmenterGranularity::Word);
    segmenter->set_segmented_text(long_string);

    size_t boundary = long_string.bytes_as_string_view().length();
    boundaries.append(boundary);
    while (true) {
        auto next_boundary = segmenter->previous_boundary(boundary);
        if (!next_boundary.has_value())
            break;

        boundary = next_boundary.value();
        boundaries.append(boundary);
    }

    EXPECT_EQ(boundaries.size(), 2 * N + 1);
}