simdjson / experimental_json_builder

Experimental JSON builder based on C++ reflection
Apache License 2.0
9 stars 0 forks source link

examine temporary tuple constructions during the runtime #15

Open lemire opened 1 month ago

lemire commented 1 month ago

The struct_to_tuple function builds, at runtime, what is effectively a copy of any struct, but organized as a tuple.

So if you have...

struct mytype {
 std::string value1;
 std::string value2;
 int x;
}

Then it will construct (at runtime), something like this...

std::tuple<std::string,std::string,int> t;

That's at runtime, so it is not at all free.

You can help things a little bit by casting to references so that you have...

std::tuple<std::string&,std::string&,int&> t;

In at least one benchmark, just replacing the copies by reference made a large difference (see https://github.com/simdjson/experimental_json_builder/pull/14).

Still, we construct an std::tuple for every single struct or class we serialize. While this construction is convenient, it might be unnecessary. A sufficiently advanced compiler can probably lift the overhead, but it might be better if we could get rid of this intermediate construction.

lemire commented 1 month ago

Turns out that it is quite easy to remove the temporary tuples, see commit https://github.com/simdjson/experimental_json_builder/pull/16/commits/cd436d23da0f5ea92c7dd865d714881fe1bbd14b