Integer Division: Compile-Time Constant vs. Runtime Variable
Question 9 / 51 • Correct so far: 0 (0 answered)
Const Divide
long long divideByConstant(const std::vector<int>& data) {
long long sum = 0;
for (int x : data)
sum += x / kDivisor;
return sum;
}
long long result = divideByConstant(DATA); Var Divide
long long divideByVariable(const std::vector<int>& data, int divisor) {
long long sum = 0;
for (int x : data)
sum += x / divisor;
return sum;
}
long long result = divideByVariable(DATA, divisor); Shared test data (shared-setup)
constexpr int kDataSize = 65536;
constexpr int kDivisor = 7;
static std::vector<int> makeData() {
std::vector<int> v(kDataSize);
for (int i = 0; i < kDataSize; ++i)
v[i] = i + 1;
return v;
}
static const std::vector<int> DATA = makeData(); Which snippet is faster?
Snippet A is faster. Dividing by a compile-time constant lets the compiler replace the hardware divide instruction with a multiply-and-shift sequence (a fixed reciprocal), which has much lower latency and higher throughput. A runtime variable divisor requires the actual integer divide instruction, which takes 20–90 cycles on modern x86.
Benchmark results
| Snippet | CPU time / iteration | Speedup |
|---|---|---|
| Const Divide | 5.94 us | 12.4× |
| Var Divide | 73.9 us | 1.0× |
Explore the source
Open in Compiler ExplorerQuiz complete. You can return to the question list to restart and compare.