Listing all keys in the wallet was consuming >75% of profiling time. Displaying data in microseconds and doing more iterations.

This commit is contained in:
clemahieu 2015-11-05 00:04:32 -06:00
commit e2bfd293d7
4 changed files with 31 additions and 24 deletions

View file

@ -478,7 +478,9 @@ TEST (system, generate_send_existing)
rai::transaction transaction (system.wallet (0)->store.environment, nullptr, false); rai::transaction transaction (system.wallet (0)->store.environment, nullptr, false);
ASSERT_FALSE (system.nodes [0]->store.account_get (transaction, rai::test_genesis_key.pub, info1)); ASSERT_FALSE (system.nodes [0]->store.account_get (transaction, rai::test_genesis_key.pub, info1));
} }
system.generate_send_existing (*system.nodes [0]); std::vector <rai::account> accounts;
accounts.push_back (rai::test_genesis_key.pub);
system.generate_send_existing (*system.nodes [0], accounts);
rai::account_info info2; rai::account_info info2;
{ {
rai::transaction transaction (system.wallet (0)->store.environment, nullptr, false); rai::transaction transaction (system.wallet (0)->store.environment, nullptr, false);
@ -512,7 +514,9 @@ TEST (system, generate_send_new)
++iterator1; ++iterator1;
ASSERT_EQ (system.nodes [0]->store.latest_end (), iterator1); ASSERT_EQ (system.nodes [0]->store.latest_end (), iterator1);
} }
system.generate_send_new (*system.nodes [0]); std::vector <rai::account> accounts;
accounts.push_back (rai::test_genesis_key.pub);
system.generate_send_new (*system.nodes [0], accounts);
rai::account new_account (0); rai::account new_account (0);
{ {
rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false); rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false);

View file

@ -94,13 +94,14 @@ public:
{ {
auto count_l (count - 1); auto count_l (count - 1);
count = count_l - 1; count = count_l - 1;
system.generate_activity (*node); system.generate_activity (*node, accounts);
if (count_l > 0) if (count_l > 0)
{ {
auto this_l (shared_from_this ()); auto this_l (shared_from_this ());
node->service.add (std::chrono::system_clock::now () + std::chrono::milliseconds (wait), [this_l] () {this_l->run ();}); node->service.add (std::chrono::system_clock::now () + std::chrono::milliseconds (wait), [this_l] () {this_l->run ();});
} }
} }
std::vector <rai::account> accounts;
uint32_t count; uint32_t count;
uint32_t wait; uint32_t wait;
std::shared_ptr <rai::node> node; std::shared_ptr <rai::node> node;
@ -124,24 +125,23 @@ void rai::system::generate_usage_traffic (uint32_t count_a, uint32_t wait_a, siz
generate->run (); generate->run ();
} }
void rai::system::generate_activity (rai::node & node_a) void rai::system::generate_activity (rai::node & node_a, std::vector <rai::account> & accounts_a)
{ {
auto what (random_pool.GenerateByte ()); auto what (random_pool.GenerateByte ());
if (what < 0xc0) if (what < 0xc0)
{ {
generate_send_existing (node_a); generate_send_existing (node_a, accounts_a);
} }
else else
{ {
generate_send_new (node_a); generate_send_new (node_a, accounts_a);
} }
} }
rai::account rai::system::get_random_account (MDB_txn * transaction_a, rai::node & node_a) rai::account rai::system::get_random_account (std::vector <rai::account> & accounts_a)
{ {
auto accounts (wallet (0)->store.accounts (transaction_a)); auto index (random_pool.GenerateWord32 (0, accounts_a.size () - 1));
auto index (random_pool.GenerateWord32 (0, accounts.size () - 1)); auto result (accounts_a [index]);
auto result (accounts [index]);
return result; return result;
} }
@ -156,7 +156,7 @@ rai::uint128_t rai::system::get_random_amount (MDB_txn * transaction_a, rai::nod
return result; return result;
} }
void rai::system::generate_send_existing (rai::node & node_a) void rai::system::generate_send_existing (rai::node & node_a, std::vector <rai::account> & accounts_a)
{ {
rai::uint128_t amount; rai::uint128_t amount;
rai::account destination; rai::account destination;
@ -172,13 +172,13 @@ void rai::system::generate_send_existing (rai::node & node_a)
} }
assert (entry != node_a.store.latest_end ()); assert (entry != node_a.store.latest_end ());
destination = rai::account (entry->first); destination = rai::account (entry->first);
source = get_random_account (transaction, node_a); source = get_random_account (accounts_a);
amount = get_random_amount (transaction, node_a, source); amount = get_random_amount (transaction, node_a, source);
} }
wallet (0)->send_sync (source, destination, amount); wallet (0)->send_sync (source, destination, amount);
} }
void rai::system::generate_send_new (rai::node & node_a) void rai::system::generate_send_new (rai::node & node_a, std::vector <rai::account> & accounts_a)
{ {
assert (node_a.wallets.items.size () == 1); assert (node_a.wallets.items.size () == 1);
rai::keypair key; rai::keypair key;
@ -186,26 +186,30 @@ void rai::system::generate_send_new (rai::node & node_a)
rai::account source; rai::account source;
{ {
rai::transaction transaction (node_a.store.environment, nullptr, false); rai::transaction transaction (node_a.store.environment, nullptr, false);
source = get_random_account (transaction, node_a); source = get_random_account (accounts_a);
amount = get_random_amount (transaction, node_a, source); amount = get_random_amount (transaction, node_a, source);
} }
accounts_a.push_back (key.pub);
node_a.wallets.items.begin ()->second->insert (key.prv); node_a.wallets.items.begin ()->second->insert (key.prv);
node_a.wallets.items.begin ()->second->send_sync (source, key.pub, amount); node_a.wallets.items.begin ()->second->send_sync (source, key.pub, amount);
} }
void rai::system::generate_mass_activity (uint32_t count_a, rai::node & node_a) void rai::system::generate_mass_activity (uint32_t count_a, rai::node & node_a)
{ {
std::vector <rai::account> accounts;
wallet (0)->insert (rai::test_genesis_key.prv);
accounts.push_back (rai::test_genesis_key.pub);
auto previous (std::chrono::system_clock::now ()); auto previous (std::chrono::system_clock::now ());
for (uint32_t i (0); i < count_a; ++i) for (uint32_t i (0); i < count_a; ++i)
{ {
if ((i & 0x3ff) == 0) if ((i & 0xfff) == 0)
{ {
auto now (std::chrono::system_clock::now ()); auto now (std::chrono::system_clock::now ());
auto ms (std::chrono::duration_cast <std::chrono::milliseconds> (now - previous).count ()); auto us (std::chrono::duration_cast <std::chrono::microseconds> (now - previous).count ());
std::cerr << boost::str (boost::format ("Mass activity iteration %1% ms %2% ms/t %3%\n") % i % ms % (ms / 256)); std::cerr << boost::str (boost::format ("Mass activity iteration %1% us %2% us/t %3%\n") % i % us % (us / 256));
previous = now; previous = now;
} }
generate_activity (node_a); generate_activity (node_a, accounts);
} }
} }

View file

@ -9,14 +9,14 @@ class system
public: public:
system (uint16_t, size_t); system (uint16_t, size_t);
~system (); ~system ();
void generate_activity (rai::node &); void generate_activity (rai::node &, std::vector <rai::account> &);
void generate_mass_activity (uint32_t, rai::node &); void generate_mass_activity (uint32_t, rai::node &);
void generate_usage_traffic (uint32_t, uint32_t, size_t); void generate_usage_traffic (uint32_t, uint32_t, size_t);
void generate_usage_traffic (uint32_t, uint32_t); void generate_usage_traffic (uint32_t, uint32_t);
rai::account get_random_account (MDB_txn *, rai::node &); rai::account get_random_account (std::vector <rai::account> &);
rai::uint128_t get_random_amount (MDB_txn *, rai::node &, rai::account const &); rai::uint128_t get_random_amount (MDB_txn *, rai::node &, rai::account const &);
void generate_send_new (rai::node &); void generate_send_new (rai::node &, std::vector <rai::account> &);
void generate_send_existing (rai::node &); void generate_send_existing (rai::node &, std::vector <rai::account> &);
std::shared_ptr <rai::wallet> wallet (size_t); std::shared_ptr <rai::wallet> wallet (size_t);
rai::account account (MDB_txn *, size_t); rai::account account (MDB_txn *, size_t);
void poll (); void poll ();

View file

@ -183,8 +183,7 @@ int main (int argc, char * const * argv)
else if (vm.count ("debug_mass_activity")) else if (vm.count ("debug_mass_activity"))
{ {
rai::system system (24000, 1); rai::system system (24000, 1);
system.wallet (0)->insert (rai::test_genesis_key.prv); size_t count (1000000);
size_t count (10000);
system.generate_mass_activity (count, *system.nodes [0]); system.generate_mass_activity (count, *system.nodes [0]);
} }
else if (vm.count ("debug_profile_kdf")) else if (vm.count ("debug_profile_kdf"))