diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt index 86a4ef51..90a6f7b0 100644 --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -1,3 +1,4 @@ add_subdirectory( cli_wallet ) add_subdirectory( witness_node ) add_subdirectory( js_operation_serializer ) +add_subdirectory( size_checker ) diff --git a/programs/size_checker/CMakeLists.txt b/programs/size_checker/CMakeLists.txt new file mode 100644 index 00000000..8d9e752d --- /dev/null +++ b/programs/size_checker/CMakeLists.txt @@ -0,0 +1,7 @@ +add_executable( size_checker main.cpp ) +if( UNIX AND NOT APPLE ) + set(rt_library rt ) +endif() + +target_link_libraries( size_checker + PRIVATE graphene_chain fc ${CMAKE_DL_LIBS} ${PLATFORM_SPECIFIC_LIBS} ) diff --git a/programs/size_checker/main.cpp b/programs/size_checker/main.cpp new file mode 100644 index 00000000..d81f469a --- /dev/null +++ b/programs/size_checker/main.cpp @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2015, Cryptonomex, Inc. + * All rights reserved. + * + * This source code is provided for evaluation in private test networks only, until September 8, 2015. After this date, this license expires and + * the code may not be used, modified or distributed for any purpose. Redistribution and use in source and binary forms, with or without modification, + * are permitted until September 8, 2015, provided that the following conditions are met: + * + * 1. The code and/or derivative works are used only for private test networks consisting of no more than 10 P2P nodes. + * + * 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. + */ + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +using namespace graphene::chain; + +vector< fc::variant_object > g_op_types; + +template< typename T > +uint64_t get_wire_size() +{ + T data; + return fc::raw::pack( data ).size(); +} + +struct size_check_type_visitor +{ + typedef void result_type; + + int t = 0; + size_check_type_visitor(int _t ):t(_t){} + + template + result_type operator()( const Type& op )const + { + fc::mutable_variant_object vo; + vo["name"] = fc::get_typename::name(); + vo["mem_size"] = sizeof( Type ); + vo["wire_size"] = get_wire_size(); + g_op_types.push_back( vo ); + } +}; + +int main( int argc, char** argv ) +{ + try + { + graphene::chain::operation op; + + for( int32_t i = 0; i < op.count(); ++i ) + { + op.set_which(i); + op.visit( size_check_type_visitor(i) ); + } + + // sort them by mem size + std::stable_sort( g_op_types.begin(), g_op_types.end(), + [](const variant_object& oa, const variant_object& ob) { + return oa["mem_size"].as_uint64() > ob["mem_size"].as_uint64(); + }); + std::cout << "[\n"; + for( size_t i=0; i