Skip to content

Commit 10bc5bb

Browse files
committed
Improve branch prediction
1 parent 34a01ec commit 10bc5bb

23 files changed

Lines changed: 339 additions & 339 deletions

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/element-inl.h

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ simdjson_inline simdjson_result<dom::element>::simdjson_result(dom::element &&va
2525
simdjson_inline simdjson_result<dom::element>::simdjson_result(error_code error) noexcept
2626
: internal::simdjson_result_base<dom::element>(error) {}
2727
inline simdjson_result<dom::element_type> simdjson_result<dom::element>::type() const noexcept {
28-
if (error()) { return error(); }
28+
if (simdjson_unlikely(error())) { return error(); }
2929
return first.type();
3030
}
3131

@@ -35,49 +35,49 @@ simdjson_inline bool simdjson_result<dom::element>::is() const noexcept {
3535
}
3636
template<typename T>
3737
simdjson_inline simdjson_result<T> simdjson_result<dom::element>::get() const noexcept {
38-
if (error()) { return error(); }
38+
if (simdjson_unlikely(error())) { return error(); }
3939
return first.get<T>();
4040
}
4141
template<typename T>
4242
simdjson_warn_unused simdjson_inline error_code simdjson_result<dom::element>::get(T &value) const noexcept {
43-
if (error()) { return error(); }
43+
if (simdjson_unlikely(error())) { return error(); }
4444
return first.get<T>(value);
4545
}
4646

4747
simdjson_inline simdjson_result<dom::array> simdjson_result<dom::element>::get_array() const noexcept {
48-
if (error()) { return error(); }
48+
if (simdjson_unlikely(error())) { return error(); }
4949
return first.get_array();
5050
}
5151
simdjson_inline simdjson_result<dom::object> simdjson_result<dom::element>::get_object() const noexcept {
52-
if (error()) { return error(); }
52+
if (simdjson_unlikely(error())) { return error(); }
5353
return first.get_object();
5454
}
5555
simdjson_inline simdjson_result<const char *> simdjson_result<dom::element>::get_c_str() const noexcept {
56-
if (error()) { return error(); }
56+
if (simdjson_unlikely(error())) { return error(); }
5757
return first.get_c_str();
5858
}
5959
simdjson_inline simdjson_result<size_t> simdjson_result<dom::element>::get_string_length() const noexcept {
60-
if (error()) { return error(); }
60+
if (simdjson_unlikely(error())) { return error(); }
6161
return first.get_string_length();
6262
}
6363
simdjson_inline simdjson_result<std::string_view> simdjson_result<dom::element>::get_string() const noexcept {
64-
if (error()) { return error(); }
64+
if (simdjson_unlikely(error())) { return error(); }
6565
return first.get_string();
6666
}
6767
simdjson_inline simdjson_result<int64_t> simdjson_result<dom::element>::get_int64() const noexcept {
68-
if (error()) { return error(); }
68+
if (simdjson_unlikely(error())) { return error(); }
6969
return first.get_int64();
7070
}
7171
simdjson_inline simdjson_result<uint64_t> simdjson_result<dom::element>::get_uint64() const noexcept {
72-
if (error()) { return error(); }
72+
if (simdjson_unlikely(error())) { return error(); }
7373
return first.get_uint64();
7474
}
7575
simdjson_inline simdjson_result<double> simdjson_result<dom::element>::get_double() const noexcept {
76-
if (error()) { return error(); }
76+
if (simdjson_unlikely(error())) { return error(); }
7777
return first.get_double();
7878
}
7979
simdjson_inline simdjson_result<bool> simdjson_result<dom::element>::get_bool() const noexcept {
80-
if (error()) { return error(); }
80+
if (simdjson_unlikely(error())) { return error(); }
8181
return first.get_bool();
8282
}
8383

@@ -111,37 +111,37 @@ simdjson_inline bool simdjson_result<dom::element>::is_null() const noexcept {
111111
}
112112

113113
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::operator[](std::string_view key) const noexcept {
114-
if (error()) { return error(); }
114+
if (simdjson_unlikely(error())) { return error(); }
115115
return first[key];
116116
}
117117
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::operator[](const char *key) const noexcept {
118-
if (error()) { return error(); }
118+
if (simdjson_unlikely(error())) { return error(); }
119119
return first[key];
120120
}
121121
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_pointer(const std::string_view json_pointer) const noexcept {
122-
if (error()) { return error(); }
122+
if (simdjson_unlikely(error())) { return error(); }
123123
return first.at_pointer(json_pointer);
124124
}
125125
#ifndef SIMDJSON_DISABLE_DEPRECATED_API
126126
[[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]]
127127
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at(const std::string_view json_pointer) const noexcept {
128128
SIMDJSON_PUSH_DISABLE_WARNINGS
129129
SIMDJSON_DISABLE_DEPRECATED_WARNING
130-
if (error()) { return error(); }
130+
if (simdjson_unlikely(error())) { return error(); }
131131
return first.at(json_pointer);
132132
SIMDJSON_POP_DISABLE_WARNINGS
133133
}
134134
#endif // SIMDJSON_DISABLE_DEPRECATED_API
135135
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at(size_t index) const noexcept {
136-
if (error()) { return error(); }
136+
if (simdjson_unlikely(error())) { return error(); }
137137
return first.at(index);
138138
}
139139
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_key(std::string_view key) const noexcept {
140-
if (error()) { return error(); }
140+
if (simdjson_unlikely(error())) { return error(); }
141141
return first.at_key(key);
142142
}
143143
simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_key_case_insensitive(std::string_view key) const noexcept {
144-
if (error()) { return error(); }
144+
if (simdjson_unlikely(error())) { return error(); }
145145
return first.at_key_case_insensitive(key);
146146
}
147147

@@ -173,11 +173,11 @@ simdjson_inline simdjson_result<dom::element>::operator dom::object() const noex
173173
}
174174

175175
simdjson_inline dom::array::iterator simdjson_result<dom::element>::begin() const noexcept(false) {
176-
if (error()) { throw simdjson_error(error()); }
176+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
177177
return first.begin();
178178
}
179179
simdjson_inline dom::array::iterator simdjson_result<dom::element>::end() const noexcept(false) {
180-
if (error()) { throw simdjson_error(error()); }
180+
if (simdjson_unlikely(error())) { throw simdjson_error(error()); }
181181
return first.end();
182182
}
183183

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)