Skip to content

Commit a04fc92

Browse files
committed
optimize if branch using likely
1 parent c5e5b3a commit a04fc92

File tree

4 files changed

+33
-20
lines changed

4 files changed

+33
-20
lines changed

modules/graph/grin/src/index/order.cc

+2-4
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,9 @@ bool grin_smaller_vertex(GRIN_GRAPH g, GRIN_VERTEX v1, GRIN_VERTEX v2) {
2525
#if defined(GRIN_ASSUME_ALL_VERTEX_LIST_SORTED) && defined(GRIN_ENABLE_VERTEX_LIST_ARRAY)
2626
size_t grin_get_position_of_vertex_from_sorted_list(GRIN_GRAPH g, GRIN_VERTEX_LIST vl, GRIN_VERTEX v) {
2727
auto _vl = static_cast<GRIN_VERTEX_LIST_T*>(vl);
28-
if (v < _vl->end_ && v >= _vl->begin_) return v - _vl->begin_;
29-
if (_vl->is_simple) return GRIN_NULL_SIZE;
30-
if (_vl->offsets.empty()) __grin_init_complex_vertex_list(static_cast<GRIN_GRAPH_T*>(g)->g, _vl);
28+
if (likely(_vl->is_simple)) return v - _vl->begin_;
3129
auto _cache = static_cast<GRIN_GRAPH_T*>(g)->cache;
3230
auto vtype = _cache->id_parser.GetLabelId(v);
33-
return v - _vl->offsets[vtype].second + _vl->offsets[vtype].first;
31+
return v - _vl->offsets[vtype].second;
3432
}
3533
#endif

modules/graph/grin/src/predefine.h

+17
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,23 @@ extern "C" {
2828
#include "client/client.h"
2929
#include "arrow/api.h"
3030

31+
#if (defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__IBMC__) || \
32+
defined(__INTEL_COMPILER) || defined(__clang__)
33+
#ifndef unlikely
34+
#define unlikely(x_) __builtin_expect(!!(x_), 0)
35+
#endif
36+
#ifndef likely
37+
#define likely(x_) __builtin_expect(!!(x_), 1)
38+
#endif
39+
#else
40+
#ifndef unlikely
41+
#define unlikely(x_) (x_)
42+
#endif
43+
#ifndef likely
44+
#define likely(x_) (x_)
45+
#endif
46+
#endif
47+
3148
template <typename T>
3249
struct GRIN_DATATYPE_ENUM {
3350
static constexpr GRIN_DATATYPE value = GRIN_DATATYPE::Undefined;

modules/graph/grin/src/topology/adjacentlist.cc

+9-9
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,17 @@ void grin_destroy_adjacent_list(GRIN_GRAPH g, GRIN_ADJACENT_LIST al) {
4343

4444
size_t grin_get_adjacent_list_size(GRIN_GRAPH g, GRIN_ADJACENT_LIST al) {
4545
auto _al = static_cast<GRIN_ADJACENT_LIST_T*>(al);
46-
if (_al->is_simple) return _al->end_ - _al->begin_;
47-
if (_al->offsets.empty()) __grin_init_complex_adjacent_list(static_cast<GRIN_GRAPH_T*>(g)->g, _al);
46+
if (likely(_al->is_simple)) return _al->end_ - _al->begin_;
47+
if (unlikely(_al->offsets.empty())) __grin_init_complex_adjacent_list(static_cast<GRIN_GRAPH_T*>(g)->g, _al);
4848
return _al->offsets[_al->etype].first;
4949
}
5050

5151
GRIN_VERTEX grin_get_neighbor_from_adjacent_list(GRIN_GRAPH g, GRIN_ADJACENT_LIST al, size_t idx) {
5252
auto _al = static_cast<GRIN_ADJACENT_LIST_T*>(al);
5353
auto nbr = _al->begin_ + idx;
54-
if (nbr < _al->end_) return nbr->vid;
55-
if (_al->is_simple) return GRIN_NULL_VERTEX;
56-
if (_al->offsets.empty()) __grin_init_complex_adjacent_list(static_cast<GRIN_GRAPH_T*>(g)->g, _al);
54+
if (likely(nbr < _al->end_)) return nbr->vid;
55+
if (likely(_al->is_simple)) return GRIN_NULL_VERTEX;
56+
if (unlikely(_al->offsets.empty())) __grin_init_complex_adjacent_list(static_cast<GRIN_GRAPH_T*>(g)->g, _al);
5757
for (unsigned i = 0; i < _al->etype; ++i) {
5858
if (idx < _al->offsets[i+1].first) {
5959
nbr = _al->offsets[i].second + idx - _al->offsets[i].first;
@@ -66,7 +66,7 @@ GRIN_VERTEX grin_get_neighbor_from_adjacent_list(GRIN_GRAPH g, GRIN_ADJACENT_LIS
6666
GRIN_EDGE grin_get_edge_from_adjacent_list(GRIN_GRAPH g, GRIN_ADJACENT_LIST al, size_t idx) {
6767
auto _al = static_cast<GRIN_ADJACENT_LIST_T*>(al);
6868
auto nbr = _al->begin_ + idx;
69-
if (nbr < _al->end_) {
69+
if (likely(nbr < _al->end_)) {
7070
auto e = new GRIN_EDGE_T();
7171
e->dir = _al->dir;
7272
e->etype = _al->etype;
@@ -80,8 +80,8 @@ GRIN_EDGE grin_get_edge_from_adjacent_list(GRIN_GRAPH g, GRIN_ADJACENT_LIST al,
8080
}
8181
return e;
8282
}
83-
if (_al->is_simple) return GRIN_NULL_EDGE;
84-
if (_al->offsets.empty()) __grin_init_complex_adjacent_list(static_cast<GRIN_GRAPH_T*>(g)->g, _al);
83+
if (likely(_al->is_simple)) return GRIN_NULL_EDGE;
84+
if (unlikely(_al->offsets.empty())) __grin_init_complex_adjacent_list(static_cast<GRIN_GRAPH_T*>(g)->g, _al);
8585
for (unsigned i = 0; i < _al->etype; ++i) {
8686
if (idx < _al->offsets[i+1].first) {
8787
nbr = _al->offsets[i].second + idx - _al->offsets[i].first;
@@ -132,7 +132,7 @@ void grin_get_next_adjacent_list_iter(GRIN_GRAPH g, GRIN_ADJACENT_LIST_ITERATOR
132132
auto _ali = static_cast<GRIN_ADJACENT_LIST_ITERATOR_T*>(ali);
133133
_ali->current_++;
134134
if (_ali->current_ < _ali->end_) return;
135-
if (_ali->is_simple) {
135+
if (likely(_ali->is_simple)) {
136136
_ali->etype_current++;
137137
return;
138138
}

modules/graph/grin/src/topology/vertexlist.cc

+5-7
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ GRIN_VERTEX_LIST grin_get_vertex_list(GRIN_GRAPH g) {
3030
__grin_init_simple_vertex_list(_g, vl);
3131
} else {
3232
vl->is_simple = false;
33+
__grin_init_complex_vertex_list(_g, vl);
3334
}
3435
return vl;
3536
}
@@ -42,16 +43,14 @@ void grin_destroy_vertex_list(GRIN_GRAPH g, GRIN_VERTEX_LIST vl) {
4243
size_t grin_get_vertex_list_size(GRIN_GRAPH g, GRIN_VERTEX_LIST vl) {
4344
auto _vl = static_cast<GRIN_VERTEX_LIST_T*>(vl);
4445
if (_vl->is_simple) return _vl->end_ - _vl->begin_;
45-
if (_vl->offsets.empty()) __grin_init_complex_vertex_list(static_cast<GRIN_GRAPH_T*>(g)->g, _vl);
4646
return _vl->offsets[_vl->vtype].first;
4747
}
4848

4949
GRIN_VERTEX grin_get_vertex_from_list(GRIN_GRAPH g, GRIN_VERTEX_LIST vl, size_t idx) {
5050
auto _vl = static_cast<GRIN_VERTEX_LIST_T*>(vl);
5151
auto v = _vl->begin_ + idx;
52-
if (v < _vl->end_) return v;
53-
if (_vl->is_simple) return GRIN_NULL_VERTEX;
54-
if (_vl->offsets.empty()) __grin_init_complex_vertex_list(static_cast<GRIN_GRAPH_T*>(g)->g, _vl);
52+
if (likely(v < _vl->end_)) return v;
53+
if (likely(_vl->is_simple)) return GRIN_NULL_VERTEX;
5554
for (unsigned i = 0; i < _vl->vtype; ++i) {
5655
if (idx < _vl->offsets[i+1].first) {
5756
v = _vl->offsets[i].second + idx - _vl->offsets[i].first;
@@ -89,12 +88,11 @@ void grin_destroy_vertex_list_iter(GRIN_GRAPH g, GRIN_VERTEX_LIST_ITERATOR vli)
8988
void grin_get_next_vertex_list_iter(GRIN_GRAPH g, GRIN_VERTEX_LIST_ITERATOR vli) {
9089
auto _vli = static_cast<GRIN_VERTEX_LIST_ITERATOR_T*>(vli);
9190
_vli->current_++;
92-
if (_vli->current_ < _vli->end_) return;
93-
if (_vli->is_simple) {
91+
if (likely(_vli->current_ < _vli->end_)) return;
92+
if (likely(_vli->is_simple)) {
9493
_vli->vtype_current++;
9594
return;
9695
}
97-
9896
auto _g = static_cast<GRIN_GRAPH_T*>(g)->g;
9997
_GRIN_GRAPH_T::vertex_range_t vr;
10098
_vli->vtype_current++;

0 commit comments

Comments
 (0)