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);
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::transaction transaction (system.wallet (0)->store.environment, nullptr, false);
@ -512,7 +514,9 @@ TEST (system, generate_send_new)
++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::transaction transaction (system.nodes [0]->store.environment, nullptr, false);

View file

@ -94,13 +94,14 @@ public:
{
auto count_l (count - 1);
count = count_l - 1;
system.generate_activity (*node);
system.generate_activity (*node, accounts);
if (count_l > 0)
{
auto this_l (shared_from_this ());
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 wait;
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 ();
}
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 ());
if (what < 0xc0)
{
generate_send_existing (node_a);
generate_send_existing (node_a, accounts_a);
}
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.size () - 1));
auto result (accounts [index]);
auto index (random_pool.GenerateWord32 (0, accounts_a.size () - 1));
auto result (accounts_a [index]);
return result;
}
@ -156,7 +156,7 @@ rai::uint128_t rai::system::get_random_amount (MDB_txn * transaction_a, rai::nod
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::account destination;
@ -172,13 +172,13 @@ void rai::system::generate_send_existing (rai::node & node_a)
}
assert (entry != node_a.store.latest_end ());
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);
}
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);
rai::keypair key;
@ -186,26 +186,30 @@ void rai::system::generate_send_new (rai::node & node_a)
rai::account source;
{
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);
}
accounts_a.push_back (key.pub);
node_a.wallets.items.begin ()->second->insert (key.prv);
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)
{
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 ());
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 ms (std::chrono::duration_cast <std::chrono::milliseconds> (now - previous).count ());
std::cerr << boost::str (boost::format ("Mass activity iteration %1% ms %2% ms/t %3%\n") % i % ms % (ms / 256));
auto us (std::chrono::duration_cast <std::chrono::microseconds> (now - previous).count ());
std::cerr << boost::str (boost::format ("Mass activity iteration %1% us %2% us/t %3%\n") % i % us % (us / 256));
previous = now;
}
generate_activity (node_a);
generate_activity (node_a, accounts);
}
}

View file

@ -9,14 +9,14 @@ class system
public:
system (uint16_t, size_t);
~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_usage_traffic (uint32_t, uint32_t, size_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 &);
void generate_send_new (rai::node &);
void generate_send_existing (rai::node &);
void generate_send_new (rai::node &, std::vector <rai::account> &);
void generate_send_existing (rai::node &, std::vector <rai::account> &);
std::shared_ptr <rai::wallet> wallet (size_t);
rai::account account (MDB_txn *, size_t);
void poll ();

View file

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