mirror of https://github.com/grpc/grpc.git
Merge pull request #18910 from arjunroy/slice_eq_static
Added slice equality when static fastpath.pull/19014/head
commit
50e16f6d3a
23 changed files with 198 additions and 105 deletions
@ -0,0 +1,50 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2019 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
|
||||
#ifndef GRPC_CORE_LIB_SLICE_SLICE_UTILS_H |
||||
#define GRPC_CORE_LIB_SLICE_SLICE_UTILS_H |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#include <grpc/slice.h> |
||||
|
||||
// When we compare two slices, and we know the latter is not inlined, we can
|
||||
// short circuit our comparison operator. We specifically use differs()
|
||||
// semantics instead of equals() semantics due to more favourable code
|
||||
// generation when using differs(). Specifically, we may use the output of
|
||||
// grpc_slice_differs_refcounted for control flow. If we use differs()
|
||||
// semantics, we end with a tailcall to memcmp(). If we use equals() semantics,
|
||||
// we need to invert the result that memcmp provides us, which costs several
|
||||
// instructions to do so. If we're using the result for control flow (i.e.
|
||||
// branching based on the output) then we're just performing the extra
|
||||
// operations to invert the result pointlessly. Concretely, we save 6 ops on
|
||||
// x86-64/clang with differs().
|
||||
int grpc_slice_differs_refcounted(const grpc_slice& a, |
||||
const grpc_slice& b_not_inline); |
||||
// When we compare two slices, and we *know* that one of them is static or
|
||||
// interned, we can short circuit our slice equality function. The second slice
|
||||
// here must be static or interned; slice a can be any slice, inlined or not.
|
||||
inline bool grpc_slice_eq_static_interned(const grpc_slice& a, |
||||
const grpc_slice& b_static_interned) { |
||||
if (a.refcount == b_static_interned.refcount) { |
||||
return true; |
||||
} |
||||
return !grpc_slice_differs_refcounted(a, b_static_interned); |
||||
} |
||||
|
||||
#endif /* GRPC_CORE_LIB_SLICE_SLICE_UTILS_H */ |
Loading…
Reference in new issue