Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
3a64443
trimming some unnecessary code
lemire Mar 20, 2024
3f9cb0f
fixing missing rvv implementation
lemire Mar 20, 2024
a9ea1c6
completing the base64 implementation.
lemire Mar 22, 2024
0f49240
adding ppc64
lemire Mar 22, 2024
5daa520
saving
Mar 22, 2024
151aa09
saturated.
lemire Mar 22, 2024
b917aa8
finishing...
Mar 22, 2024
ca17560
various fixes
Mar 27, 2024
94b7dac
Implemented bun benchmark
lemire Mar 27, 2024
c35d8df
Obvious fix.
lemire Mar 27, 2024
1a90f2a
documentation
lemire Mar 27, 2024
bd454ea
adding libbase64 competitor
lemire Mar 27, 2024
bdab72f
more documentation.
lemire Mar 27, 2024
65f933b
base64url (first steps)
lemire Mar 28, 2024
4aa837d
working through
lemire Mar 28, 2024
8dc79aa
implemented base64url for ARM.
lemire Mar 29, 2024
fe1138f
documentation.
lemire Mar 29, 2024
5d1d0d5
prototype base64url
Mar 30, 2024
21717c4
solved based64url
Mar 30, 2024
c96ac90
completing the base64 implementation.
lemire Mar 22, 2024
106e18c
adding ppc64
lemire Mar 22, 2024
d1c9cbc
saving
Mar 22, 2024
8606798
saturated.
lemire Mar 22, 2024
e7eae70
finishing...
Mar 22, 2024
9262b4b
various fixes
Mar 27, 2024
3444f4e
Implemented bun benchmark
lemire Mar 27, 2024
6949b2c
Obvious fix.
lemire Mar 27, 2024
381945b
documentation
lemire Mar 27, 2024
7b304d3
adding libbase64 competitor
lemire Mar 27, 2024
f51ffdf
more documentation.
lemire Mar 27, 2024
3d87826
base64url (first steps)
lemire Mar 28, 2024
c72079c
working through
lemire Mar 28, 2024
200b6bc
implemented base64url for ARM.
lemire Mar 29, 2024
4971bc2
documentation.
lemire Mar 29, 2024
c729247
prototype base64url
Mar 30, 2024
e32acc9
solved based64url
Mar 30, 2024
038ce51
Merge branch 'base64_part2' of github.com:simdutf/simdutf into base64…
Mar 30, 2024
9154818
fixing a missing func definition (bad signature)
lemire Mar 30, 2024
fd037f5
no such thing as version 4 of uraimo/run-on-arch-action
lemire Mar 30, 2024
0de753a
fixes
lemire Mar 30, 2024
ccdf51d
Update benchmarks/base64/benchmark_base64.cpp
lemire Mar 30, 2024
7ec70f2
Update benchmarks/base64/benchmark_base64.cpp
lemire Mar 30, 2024
18dc616
Update benchmarks/base64/libbase64_spaces.h
lemire Mar 30, 2024
aeb2f5f
Update include/simdutf/implementation.h
lemire Mar 30, 2024
e0ce663
Update src/haswell/avx2_base64.cpp
lemire Mar 30, 2024
bb9d1fc
various minor fixes (linting + comments)
Mar 30, 2024
f511d9a
adding another comment.
Mar 30, 2024
e2a224f
cleaning up the base64 benchmark flags
Mar 30, 2024
5e6a366
disabling Ubuntu rvv VLEN=1024 (clang 17) CI due to system failures
Mar 30, 2024
9a92c54
adding the option
Mar 31, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
adding libbase64 competitor
  • Loading branch information
lemire authored and Daniel Lemire committed Mar 30, 2024
commit 7b304d3cd21efb484a814ba9dcf42ff6808f6e73
24 changes: 21 additions & 3 deletions benchmarks/base64/benchmark_base64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
#include <vector>

#include "libbase64.h"
#include "libbase64_spaces.h"
#include "node_base64.h"

#include "simdutf.h"

#include "event_counter.h"
Expand Down Expand Up @@ -261,7 +263,7 @@ void bench(std::vector<std::vector<char>> &data, uint8_t mode) {
bool spaces = contains_spaces(data);
if (spaces) {
printf("# the base64 data contains spaces, so we cannot use straigth "
"libbase64::base64_decode\n");
"libbase64::base64_decode directly\n");
} else {
pretty_print(data.size(), volume, "libbase64",
bench([&data, &buffer1, &buffer2]() {
Expand All @@ -279,6 +281,21 @@ void bench(std::vector<std::vector<char>> &data, uint8_t mode) {
}
}));
}
pretty_print(
data.size(), volume, "libbase64_space_decode",
bench([&data, &buffer1, &buffer2]() {
for (const std::vector<char> &source : data) {

size_t outlen;
bool ok = libbase64_space_decode(source.data(), source.size(),
buffer1.data(), &outlen);
if (!ok) {
std::cerr << "Error: "
<< " failed to decode base64 " << std::endl;
throw std::runtime_error("Error: failed to decode base64 ");
}
}
}));
pretty_print(
data.size(), volume, "node", bench([&data, &buffer1, &buffer2]() {
for (const std::vector<char> &source : data) {
Expand Down Expand Up @@ -373,11 +390,12 @@ int bench_bun() {
std::vector<std::pair<std::string, std::string>> tests = {
{"big hello world", bigBuffer}, {"random 16 bytes", crypto}};
// Could be nicer with C++20
for (auto & i : tests) {
for (auto &i : tests) {
printf("# %s\n", i.first.c_str());
std::string source = i.second;
volatile size_t base64_size;
std::vector<char> buffer1(simdutf::base64_length_from_binary(source.size()));
std::vector<char> buffer1(
simdutf::base64_length_from_binary(source.size()));
pretty_print(1, source.size(), "libbase64",
bench([&source, &buffer1, &base64_size]() {
size_t outlen;
Expand Down
50 changes: 50 additions & 0 deletions benchmarks/base64/libbase64_spaces.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@

// https://github.com/aklomp/base64/blob/b20a31a997e0b48274fa09e58b65ee9202531e4f/bin/base64.c#L392
static inline size_t libbase64_find_space(const char *p, const size_t avail) {
for (size_t len = 0; len < avail; len++) {
if (p[len] == '\n' || p[len] == '\r' || p[len] == ' ' || p[len] == '\t') {
return len;
}
}

return avail;
}

// Inspired by
// https://github.com/aklomp/base64/blob/b20a31a997e0b48274fa09e58b65ee9202531e4f/bin/base64.c#L405

Comment thread
lemire marked this conversation as resolved.
Outdated
static bool libbase64_space_decode(const char *start, size_t avail, char *outbuf,
size_t *outlen) {
struct base64_state state;
*outlen = 0;

// Initialize the decoder's state structure.
base64_stream_decode_init(&state, 0);

while (avail > 0) {
size_t len = libbase64_find_space(start, avail);
if (len == 0) {
start++;
avail--;
continue;
}

// Decode the chunk into the raw buffer.
size_t outlen = 0;
if (base64_stream_decode(&state, start, len, outbuf, &outlen) == 0) {
// decoding error
return false;
}

// Update the output buffer pointer and total size.
outbuf += outlen;
outlen += outlen;
if(avail == len) {
break;
}

start += len + 1;
avail -= len + 1;
}
return true;
}