mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 07:31:57 +00:00
add another perf and tests
This commit is contained in:
parent
2418798e3c
commit
e8629cf4f5
@ -219,6 +219,36 @@ inline void fillConstantVector(const ArrayCond & cond, A a, const ArrayB & b, Ar
|
||||
}
|
||||
}
|
||||
|
||||
template <typename ArrayCond, typename A, typename B, typename ArrayResult, typename ResultType>
|
||||
inline void fillConstantConstant(const ArrayCond & cond, A a, B b, ArrayResult & res)
|
||||
{
|
||||
size_t size = cond.size();
|
||||
if constexpr (std::is_same_v<ResultType, Int8> || std::is_same_v<ResultType, UInt8> || is_over_big_int<ResultType>)
|
||||
{
|
||||
alignas(64) const ResultType ab[2] = {static_cast<ResultType>(a), static_cast<ResultType>(b)};
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
{
|
||||
/// Introduce memory access to avoid branch miss
|
||||
res[i] = ab[!cond[i]];
|
||||
}
|
||||
}
|
||||
else if constexpr (std::is_same_v<ResultType, Decimal32> || std::is_same_v<ResultType, Decimal64>)
|
||||
{
|
||||
ResultType new_a = static_cast<ResultType>(a);
|
||||
ResultType new_b = static_cast<ResultType>(b);
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
{
|
||||
/// Reuse new_a and new_b to achieve auto-vectorization
|
||||
res[i] = cond[i] ? new_a : new_b;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
res[i] = cond[i] ? static_cast<ResultType>(a) : static_cast<ResultType>(b);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename A, typename B, typename ResultType>
|
||||
struct NumIfImpl
|
||||
{
|
||||
@ -261,9 +291,7 @@ struct NumIfImpl
|
||||
auto col_res = ColVecResult::create(size);
|
||||
ArrayResult & res = col_res->getData();
|
||||
|
||||
/// TODO cast a and b only once
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
res[i] = cond[i] ? static_cast<ResultType>(a) : static_cast<ResultType>(b);
|
||||
fillConstantConstant<ArrayCond, A, B, ArrayResult, ResultType>(cond, a, b, res);
|
||||
return col_res;
|
||||
}
|
||||
};
|
||||
@ -312,8 +340,7 @@ struct NumIfImpl<Decimal<A>, Decimal<B>, Decimal<R>>
|
||||
auto col_res = ColVecResult::create(size, scale);
|
||||
ArrayResult & res = col_res->getData();
|
||||
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
res[i] = cond[i] ? static_cast<ResultType>(a) : static_cast<ResultType>(b);
|
||||
fillConstantConstant<ArrayCond, A, B, ArrayResult, ResultType>(cond, a, b, res);
|
||||
return col_res;
|
||||
}
|
||||
};
|
||||
|
@ -7,6 +7,18 @@
|
||||
<query><![CDATA[ SELECT count() FROM zeros(1000000000) WHERE NOT ignore(if(rand32() < 42949673, 1, zero + 2)) ]]></query>
|
||||
<query><![CDATA[ SELECT count() FROM zeros(1000000000) WHERE NOT ignore(if(rand32() < 42949673, 1, 2)) ]]></query>
|
||||
|
||||
<!-- Tests when branches are both not constant -->
|
||||
<query>with rand32() % 2 as x select if(x, materialize(1.234), materialize(2.456)) from numbers(100000000) format Null</query>
|
||||
<query>with rand32() % 2 as x, 1.234::Decimal64(3) as a, 2.456::Decimal64(3) as b select if(x, materialize(a), materialize(b)) from numbers(100000000) format Null</query>
|
||||
|
||||
<!-- Tests when branches are both constant -->
|
||||
<query>with rand32() % 2 as x, 1::Int8 as a, -1::Int8 as b select if(x, a, b) from numbers(100000000) format Null</query>
|
||||
<query>with rand32() % 2 as x, 1::Int64 as a, -1::Int64 as b select if(x, a, b) from numbers(100000000) format Null</query>
|
||||
<query>with rand32() % 2 as x, 1::Int32 as a, -1::Int32 as b select if(x, a, b) from numbers(100000000) format Null</query>
|
||||
<query>with rand32() % 2 as x, 1::Decimal32(3) as a, -1::Decimal32(3) as b select if(x, a, b) from numbers(100000000) format Null</query>
|
||||
<query>with rand32() % 2 as x, 1::Decimal64(3) as a, -1::Decimal64(3) as b select if(x, a, b) from numbers(100000000) format Null</query>
|
||||
<query>with rand32() % 2 as x, 1::Decimal128(3) as a, -1::Decimal128(3) as b select if(x, a, b) from numbers(100000000) format Null</query>
|
||||
<query>with rand32() % 2 as x, 1::Decimal256(3) as a, -1::Decimal256(3) as b select if(x, a, b) from numbers(100000000) format Null</query>
|
||||
<query>with rand32() % 2 as x, 1::Int128 as a, -1::Int128 as b select if(x, a, b) from numbers(100000000) format Null</query>
|
||||
<query>with rand32() % 2 as x, 1::Int256 as a, -1::Int256 as b select if(x, a, b) from numbers(100000000) format Null</query>
|
||||
</test>
|
||||
|
Loading…
Reference in New Issue
Block a user