mirror of
https://github.com/monero-project/monero.git
synced 2024-12-25 22:49:24 -05:00
cryptonote_basic: faster and more readable is_valid_decomposed_amount
Includes performance tests
This commit is contained in:
parent
ac02af9286
commit
a79734c848
@ -49,29 +49,6 @@ using namespace epee;
|
|||||||
|
|
||||||
using namespace crypto;
|
using namespace crypto;
|
||||||
|
|
||||||
static const uint64_t valid_decomposed_outputs[] = {
|
|
||||||
(uint64_t)1, (uint64_t)2, (uint64_t)3, (uint64_t)4, (uint64_t)5, (uint64_t)6, (uint64_t)7, (uint64_t)8, (uint64_t)9, // 1 piconero
|
|
||||||
(uint64_t)10, (uint64_t)20, (uint64_t)30, (uint64_t)40, (uint64_t)50, (uint64_t)60, (uint64_t)70, (uint64_t)80, (uint64_t)90,
|
|
||||||
(uint64_t)100, (uint64_t)200, (uint64_t)300, (uint64_t)400, (uint64_t)500, (uint64_t)600, (uint64_t)700, (uint64_t)800, (uint64_t)900,
|
|
||||||
(uint64_t)1000, (uint64_t)2000, (uint64_t)3000, (uint64_t)4000, (uint64_t)5000, (uint64_t)6000, (uint64_t)7000, (uint64_t)8000, (uint64_t)9000,
|
|
||||||
(uint64_t)10000, (uint64_t)20000, (uint64_t)30000, (uint64_t)40000, (uint64_t)50000, (uint64_t)60000, (uint64_t)70000, (uint64_t)80000, (uint64_t)90000,
|
|
||||||
(uint64_t)100000, (uint64_t)200000, (uint64_t)300000, (uint64_t)400000, (uint64_t)500000, (uint64_t)600000, (uint64_t)700000, (uint64_t)800000, (uint64_t)900000,
|
|
||||||
(uint64_t)1000000, (uint64_t)2000000, (uint64_t)3000000, (uint64_t)4000000, (uint64_t)5000000, (uint64_t)6000000, (uint64_t)7000000, (uint64_t)8000000, (uint64_t)9000000, // 1 micronero
|
|
||||||
(uint64_t)10000000, (uint64_t)20000000, (uint64_t)30000000, (uint64_t)40000000, (uint64_t)50000000, (uint64_t)60000000, (uint64_t)70000000, (uint64_t)80000000, (uint64_t)90000000,
|
|
||||||
(uint64_t)100000000, (uint64_t)200000000, (uint64_t)300000000, (uint64_t)400000000, (uint64_t)500000000, (uint64_t)600000000, (uint64_t)700000000, (uint64_t)800000000, (uint64_t)900000000,
|
|
||||||
(uint64_t)1000000000, (uint64_t)2000000000, (uint64_t)3000000000, (uint64_t)4000000000, (uint64_t)5000000000, (uint64_t)6000000000, (uint64_t)7000000000, (uint64_t)8000000000, (uint64_t)9000000000,
|
|
||||||
(uint64_t)10000000000, (uint64_t)20000000000, (uint64_t)30000000000, (uint64_t)40000000000, (uint64_t)50000000000, (uint64_t)60000000000, (uint64_t)70000000000, (uint64_t)80000000000, (uint64_t)90000000000,
|
|
||||||
(uint64_t)100000000000, (uint64_t)200000000000, (uint64_t)300000000000, (uint64_t)400000000000, (uint64_t)500000000000, (uint64_t)600000000000, (uint64_t)700000000000, (uint64_t)800000000000, (uint64_t)900000000000,
|
|
||||||
(uint64_t)1000000000000, (uint64_t)2000000000000, (uint64_t)3000000000000, (uint64_t)4000000000000, (uint64_t)5000000000000, (uint64_t)6000000000000, (uint64_t)7000000000000, (uint64_t)8000000000000, (uint64_t)9000000000000, // 1 monero
|
|
||||||
(uint64_t)10000000000000, (uint64_t)20000000000000, (uint64_t)30000000000000, (uint64_t)40000000000000, (uint64_t)50000000000000, (uint64_t)60000000000000, (uint64_t)70000000000000, (uint64_t)80000000000000, (uint64_t)90000000000000,
|
|
||||||
(uint64_t)100000000000000, (uint64_t)200000000000000, (uint64_t)300000000000000, (uint64_t)400000000000000, (uint64_t)500000000000000, (uint64_t)600000000000000, (uint64_t)700000000000000, (uint64_t)800000000000000, (uint64_t)900000000000000,
|
|
||||||
(uint64_t)1000000000000000, (uint64_t)2000000000000000, (uint64_t)3000000000000000, (uint64_t)4000000000000000, (uint64_t)5000000000000000, (uint64_t)6000000000000000, (uint64_t)7000000000000000, (uint64_t)8000000000000000, (uint64_t)9000000000000000,
|
|
||||||
(uint64_t)10000000000000000, (uint64_t)20000000000000000, (uint64_t)30000000000000000, (uint64_t)40000000000000000, (uint64_t)50000000000000000, (uint64_t)60000000000000000, (uint64_t)70000000000000000, (uint64_t)80000000000000000, (uint64_t)90000000000000000,
|
|
||||||
(uint64_t)100000000000000000, (uint64_t)200000000000000000, (uint64_t)300000000000000000, (uint64_t)400000000000000000, (uint64_t)500000000000000000, (uint64_t)600000000000000000, (uint64_t)700000000000000000, (uint64_t)800000000000000000, (uint64_t)900000000000000000,
|
|
||||||
(uint64_t)1000000000000000000, (uint64_t)2000000000000000000, (uint64_t)3000000000000000000, (uint64_t)4000000000000000000, (uint64_t)5000000000000000000, (uint64_t)6000000000000000000, (uint64_t)7000000000000000000, (uint64_t)8000000000000000000, (uint64_t)9000000000000000000, // 1 meganero
|
|
||||||
(uint64_t)10000000000000000000ull
|
|
||||||
};
|
|
||||||
|
|
||||||
static std::atomic<unsigned int> default_decimal_point(CRYPTONOTE_DISPLAY_DECIMAL_POINT);
|
static std::atomic<unsigned int> default_decimal_point(CRYPTONOTE_DISPLAY_DECIMAL_POINT);
|
||||||
|
|
||||||
static std::atomic<uint64_t> tx_hashes_calculated_count(0);
|
static std::atomic<uint64_t> tx_hashes_calculated_count(0);
|
||||||
@ -1610,9 +1587,14 @@ namespace cryptonote
|
|||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
bool is_valid_decomposed_amount(uint64_t amount)
|
bool is_valid_decomposed_amount(uint64_t amount)
|
||||||
{
|
{
|
||||||
const uint64_t *begin = valid_decomposed_outputs;
|
if (0 == amount)
|
||||||
const uint64_t *end = valid_decomposed_outputs + sizeof(valid_decomposed_outputs) / sizeof(valid_decomposed_outputs[0]);
|
return false;
|
||||||
return std::binary_search(begin, end, amount);
|
|
||||||
|
// divide out all trailing zeros (in base 10)
|
||||||
|
while (amount % 10 == 0)
|
||||||
|
amount /= 10;
|
||||||
|
|
||||||
|
return amount < 10; // are we left with 1 leading digit?
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
void get_hash_stats(uint64_t &tx_hashes_calculated, uint64_t &tx_hashes_cached, uint64_t &block_hashes_calculated, uint64_t & block_hashes_cached)
|
void get_hash_stats(uint64_t &tx_hashes_calculated, uint64_t &tx_hashes_cached, uint64_t &block_hashes_calculated, uint64_t & block_hashes_cached)
|
||||||
|
61
tests/performance_tests/is_valid_decomposed_amount.h
Normal file
61
tests/performance_tests/is_valid_decomposed_amount.h
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
// Copyright (c) 2024, The Monero Project
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
// permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
// conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
// of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
// materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
// used to endorse or promote products derived from this software without specific
|
||||||
|
// prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "cryptonote_basic/cryptonote_format_utils.h"
|
||||||
|
|
||||||
|
class test_is_valid_decomposed_amount
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static const size_t loop_count = 3;
|
||||||
|
static const uint64_t max_per_loop = 1000000000; // must be power of 10
|
||||||
|
|
||||||
|
bool init()
|
||||||
|
{
|
||||||
|
m_num_valid_per_loop = 1;
|
||||||
|
uint64_t x = 1;
|
||||||
|
while (x != max_per_loop)
|
||||||
|
{
|
||||||
|
m_num_valid_per_loop += 9;
|
||||||
|
x *= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool test()
|
||||||
|
{
|
||||||
|
size_t num_valid = 0;
|
||||||
|
for (uint64_t a = 0; a <= max_per_loop; ++a)
|
||||||
|
num_valid += cryptonote::is_valid_decomposed_amount(a);
|
||||||
|
return num_valid == m_num_valid_per_loop;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t m_num_valid_per_loop;
|
||||||
|
};
|
@ -51,6 +51,7 @@
|
|||||||
#include "generate_keypair.h"
|
#include "generate_keypair.h"
|
||||||
#include "signature.h"
|
#include "signature.h"
|
||||||
#include "is_out_to_acc.h"
|
#include "is_out_to_acc.h"
|
||||||
|
#include "is_valid_decomposed_amount.h"
|
||||||
#include "out_can_be_to_acc.h"
|
#include "out_can_be_to_acc.h"
|
||||||
#include "subaddress_expand.h"
|
#include "subaddress_expand.h"
|
||||||
#include "sc_reduce32.h"
|
#include "sc_reduce32.h"
|
||||||
@ -217,6 +218,8 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
TEST_PERFORMANCE2(filter, p, test_wallet2_expand_subaddresses, 50, 200);
|
TEST_PERFORMANCE2(filter, p, test_wallet2_expand_subaddresses, 50, 200);
|
||||||
|
|
||||||
|
TEST_PERFORMANCE0(filter, p, test_is_valid_decomposed_amount);
|
||||||
|
|
||||||
TEST_PERFORMANCE1(filter, p, test_cn_slow_hash, 0);
|
TEST_PERFORMANCE1(filter, p, test_cn_slow_hash, 0);
|
||||||
TEST_PERFORMANCE1(filter, p, test_cn_slow_hash, 1);
|
TEST_PERFORMANCE1(filter, p, test_cn_slow_hash, 1);
|
||||||
TEST_PERFORMANCE1(filter, p, test_cn_slow_hash, 2);
|
TEST_PERFORMANCE1(filter, p, test_cn_slow_hash, 2);
|
||||||
|
Loading…
Reference in New Issue
Block a user