Skip to content

Commit a3bc8d4

Browse files
committed
Improve branch prediction
1 parent 34a01ec commit a3bc8d4

20 files changed

Lines changed: 304 additions & 294 deletions

.vscode/settings.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
],
66
"files.trimTrailingWhitespace": true,
77
"files.associations": {
8+
"*.mqh": "cpp",
9+
"*.mq4": "cpp",
10+
"*.mq5": "cpp",
11+
"*.hrl": "erlang",
12+
"*.es": "erlang",
813
".clangd": "yaml",
914
"array": "cpp",
1015
"iterator": "cpp",
@@ -103,6 +108,8 @@
103108
"charconv": "cpp",
104109
"source_location": "cpp",
105110
"strstream": "cpp",
106-
"typeindex": "cpp"
111+
"typeindex": "cpp",
112+
"*.tcc": "cpp",
113+
"format": "cpp"
107114
}
108115
}

include/simdjson/common_defs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ namespace std {
263263
#undef SIMDJSON_HAS_STRING_VIEW // We are not going to need this macro anymore.
264264

265265
/// If EXPR is an error, returns it.
266-
#define SIMDJSON_TRY(EXPR) { auto _err = (EXPR); if (_err) { return _err; } }
266+
#define SIMDJSON_TRY(EXPR) { auto _err = (EXPR); if (simdjson_unlikely(_err)) { return _err; } }
267267

268268
// Unless the programmer has already set SIMDJSON_DEVELOPMENT_CHECKS,
269269
// we want to set it under debug builds. We detect a debug build

include/simdjson/dom/array-inl.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,26 +26,26 @@ simdjson_inline simdjson_result<dom::array>::simdjson_result(error_code error) n
2626
#if SIMDJSON_EXCEPTIONS
2727

2828
inline dom::array::iterator simdjson_result<dom::array>::begin() const noexcept(false) {
29-
if (error()) { throw simdjson_error(error()); }
29+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
3030
return first.begin();
3131
}
3232
inline dom::array::iterator simdjson_result<dom::array>::end() const noexcept(false) {
33-
if (error()) { throw simdjson_error(error()); }
33+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
3434
return first.end();
3535
}
3636
inline size_t simdjson_result<dom::array>::size() const noexcept(false) {
37-
if (error()) { throw simdjson_error(error()); }
37+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
3838
return first.size();
3939
}
4040

4141
#endif // SIMDJSON_EXCEPTIONS
4242

4343
inline simdjson_result<dom::element> simdjson_result<dom::array>::at_pointer(std::string_view json_pointer) const noexcept {
44-
if (error()) { return error(); }
44+
if (simdjson_unlikely(error())) { return error(); }
4545
return first.at_pointer(json_pointer);
4646
}
4747
inline simdjson_result<dom::element> simdjson_result<dom::array>::at(size_t index) const noexcept {
48-
if (error()) { return error(); }
48+
if (simdjson_unlikely(error())) { return error(); }
4949
return first.at(index);
5050
}
5151

include/simdjson/dom/document_stream-inl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,11 +320,11 @@ simdjson_inline simdjson_result<dom::document_stream>::simdjson_result(dom::docu
320320

321321
#if SIMDJSON_EXCEPTIONS
322322
simdjson_inline dom::document_stream::iterator simdjson_result<dom::document_stream>::begin() noexcept(false) {
323-
if (error()) { throw simdjson_error(error()); }
323+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
324324
return first.begin();
325325
}
326326
simdjson_inline dom::document_stream::iterator simdjson_result<dom::document_stream>::end() noexcept(false) {
327-
if (error()) { throw simdjson_error(error()); }
327+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
328328
return first.end();
329329
}
330330
#else // SIMDJSON_EXCEPTIONS

include/simdjson/dom/object-inl.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,38 +23,38 @@ simdjson_inline simdjson_result<dom::object>::simdjson_result(error_code error)
2323
: internal::simdjson_result_base<dom::object>(error) {}
2424

2525
inline simdjson_result<dom::element> simdjson_result<dom::object>::operator[](std::string_view key) const noexcept {
26-
if (error()) { return error(); }
26+
if (simdjson_unlikely(error())) { return error(); }
2727
return first[key];
2828
}
2929
inline simdjson_result<dom::element> simdjson_result<dom::object>::operator[](const char *key) const noexcept {
30-
if (error()) { return error(); }
30+
if (simdjson_unlikely(error())) { return error(); }
3131
return first[key];
3232
}
3333
inline simdjson_result<dom::element> simdjson_result<dom::object>::at_pointer(std::string_view json_pointer) const noexcept {
34-
if (error()) { return error(); }
34+
if (simdjson_unlikely(error())) { return error(); }
3535
return first.at_pointer(json_pointer);
3636
}
3737
inline simdjson_result<dom::element> simdjson_result<dom::object>::at_key(std::string_view key) const noexcept {
38-
if (error()) { return error(); }
38+
if (simdjson_unlikely(error())) { return error(); }
3939
return first.at_key(key);
4040
}
4141
inline simdjson_result<dom::element> simdjson_result<dom::object>::at_key_case_insensitive(std::string_view key) const noexcept {
42-
if (error()) { return error(); }
42+
if (simdjson_unlikely(error())) { return error(); }
4343
return first.at_key_case_insensitive(key);
4444
}
4545

4646
#if SIMDJSON_EXCEPTIONS
4747

4848
inline dom::object::iterator simdjson_result<dom::object>::begin() const noexcept(false) {
49-
if (error()) { throw simdjson_error(error()); }
49+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
5050
return first.begin();
5151
}
5252
inline dom::object::iterator simdjson_result<dom::object>::end() const noexcept(false) {
53-
if (error()) { throw simdjson_error(error()); }
53+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
5454
return first.end();
5555
}
5656
inline size_t simdjson_result<dom::object>::size() const noexcept(false) {
57-
if (error()) { throw simdjson_error(error()); }
57+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
5858
return first.size();
5959
}
6060

include/simdjson/dom/parser-inl.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ inline error_code parser::allocate(size_t capacity, size_t max_depth) noexcept {
206206
} else {
207207
err = simdjson::get_active_implementation()->create_dom_parser_implementation(capacity, max_depth, implementation);
208208
}
209-
if (err) { return err; }
209+
if (simdjson_unlikely(err)) { return err; }
210210
return SUCCESS;
211211
}
212212

@@ -238,8 +238,8 @@ inline error_code parser::ensure_capacity(document& target_document, size_t desi
238238
}
239239
error_code err1 = target_document.capacity() < desired_capacity ? target_document.allocate(desired_capacity) : SUCCESS;
240240
error_code err2 = capacity() < desired_capacity ? allocate(desired_capacity, max_depth()) : SUCCESS;
241-
if(err1 != SUCCESS) { return error = err1; }
242-
if(err2 != SUCCESS) { return error = err2; }
241+
if(simdjson_unlikely(err1 != SUCCESS)) { return error = err1; }
242+
if(simdjson_unlikely(err2 != SUCCESS)) { return error = err2; }
243243
}
244244
return SUCCESS;
245245
}

include/simdjson/error-inl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ simdjson_inline error_code simdjson_result_base<T>::error() const noexcept {
6666

6767
template<typename T>
6868
simdjson_inline T& simdjson_result_base<T>::value() & noexcept(false) {
69-
if (error()) { throw simdjson_error(error()); }
69+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
7070
return this->first;
7171
}
7272

@@ -77,7 +77,7 @@ simdjson_inline T&& simdjson_result_base<T>::value() && noexcept(false) {
7777

7878
template<typename T>
7979
simdjson_inline T&& simdjson_result_base<T>::take_value() && noexcept(false) {
80-
if (error()) { throw simdjson_error(error()); }
80+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
8181
return std::forward<T>(this->first);
8282
}
8383

include/simdjson/generic/implementation_simdjson_result_base-inl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ simdjson_inline error_code implementation_simdjson_result_base<T>::error() const
3737

3838
template<typename T>
3939
simdjson_inline T& implementation_simdjson_result_base<T>::value() & noexcept(false) {
40-
if (error()) { throw simdjson_error(error()); }
40+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
4141
return this->first;
4242
}
4343

@@ -48,7 +48,7 @@ simdjson_inline T&& implementation_simdjson_result_base<T>::value() && noexcept(
4848

4949
template<typename T>
5050
simdjson_inline T&& implementation_simdjson_result_base<T>::take_value() && noexcept(false) {
51-
if (error()) { throw simdjson_error(error()); }
51+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
5252
return std::forward<T>(this->first);
5353
}
5454

0 commit comments

Comments
 (0)