rpc_blockchain.cpp raw

   1  // Copyright (c) 2016-present The Bitcoin Core developers
   2  // Distributed under the MIT software license, see the accompanying
   3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   4  
   5  #include <bench/bench.h>
   6  #include <bench/data/block413567.raw.h>
   7  #include <chain.h>
   8  #include <consensus/params.h>
   9  #include <core_io.h>
  10  #include <kernel/chainparams.h>
  11  #include <primitives/block.h>
  12  #include <primitives/transaction.h>
  13  #include <rpc/blockchain.h>
  14  #include <serialize.h>
  15  #include <streams.h>
  16  #include <test/util/setup_common.h>
  17  #include <uint256.h>
  18  #include <univalue.h>
  19  #include <validation.h>
  20  
  21  #include <memory>
  22  #include <span>
  23  #include <string>
  24  
  25  namespace {
  26  
  27  struct TestBlockAndIndex {
  28      const std::unique_ptr<const TestingSetup> testing_setup{MakeNoLogFileContext<const TestingSetup>(ChainType::MAIN)};
  29      CBlock block{};
  30      uint256 blockHash{};
  31      CBlockIndex blockindex{};
  32  
  33      TestBlockAndIndex()
  34      {
  35          SpanReader stream{benchmark::data::block413567};
  36          stream >> TX_WITH_WITNESS(block);
  37  
  38          blockHash = block.GetHash();
  39          blockindex.phashBlock = &blockHash;
  40          blockindex.nBits = 403014710;
  41      }
  42  };
  43  
  44  } // namespace
  45  
  46  static void BlockToJson(benchmark::Bench& bench, TxVerbosity verbosity)
  47  {
  48      TestBlockAndIndex data;
  49      const uint256 pow_limit{data.testing_setup->m_node.chainman->GetParams().GetConsensus().powLimit};
  50      bench.run([&] {
  51          auto univalue = blockToJSON(data.testing_setup->m_node.chainman->m_blockman, data.block, data.blockindex, data.blockindex, verbosity, pow_limit);
  52          ankerl::nanobench::doNotOptimizeAway(univalue);
  53      });
  54  }
  55  
  56  static void BlockToJsonVerbosity1(benchmark::Bench& bench)
  57  {
  58      BlockToJson(bench, TxVerbosity::SHOW_TXID);
  59  }
  60  
  61  static void BlockToJsonVerbosity2(benchmark::Bench& bench)
  62  {
  63      BlockToJson(bench, TxVerbosity::SHOW_DETAILS);
  64  }
  65  
  66  static void BlockToJsonVerbosity3(benchmark::Bench& bench)
  67  {
  68      BlockToJson(bench, TxVerbosity::SHOW_DETAILS_AND_PREVOUT);
  69  }
  70  
  71  BENCHMARK(BlockToJsonVerbosity1);
  72  BENCHMARK(BlockToJsonVerbosity2);
  73  BENCHMARK(BlockToJsonVerbosity3);
  74  
  75  static void BlockToJsonVerboseWrite(benchmark::Bench& bench)
  76  {
  77      TestBlockAndIndex data;
  78      const uint256 pow_limit{data.testing_setup->m_node.chainman->GetParams().GetConsensus().powLimit};
  79      auto univalue = blockToJSON(data.testing_setup->m_node.chainman->m_blockman, data.block, data.blockindex, data.blockindex, TxVerbosity::SHOW_DETAILS_AND_PREVOUT, pow_limit);
  80      bench.run([&] {
  81          auto str = univalue.write();
  82          ankerl::nanobench::doNotOptimizeAway(str);
  83      });
  84  }
  85  
  86  BENCHMARK(BlockToJsonVerboseWrite);
  87