%--------------------------------------------------% % vim: ft=mercury ts=4 sw=4 et %--------------------------------------------------% % Copyright (C) 2007 The University of Melbourne. % Copyright (C) 2014-2018 The Mercury team. % This file is distributed under the terms specified in COPYING.LIB. %--------------------------------------------------% % % File: table_statistics.m. % Author: zs. % Stability: low. % % This file is automatically imported, as if via ":- use_module", into every % module that contains a `pragma memo' that asks the compiler to create % a predicate for returning statistics about the memo table. It defines % the data structure that this predicate will return, and some operations % on this data structure. % %--------------------------------------------------% %--------------------------------------------------% :- module table_statistics. :- interface. :- import_module io. :- import_module list. :- import_module maybe. :- type proc_table_statistics ---> proc_table_statistics( call_table_stats :: table_stats_curr_prev, maybe_answer_table_stats :: maybe(table_stats_curr_prev) ). :- type table_stats_curr_prev ---> table_stats_curr_prev( current_stats :: table_stats, stats_at_last_call :: table_stats ). :- type table_stats ---> table_stats( num_lookups :: int, num_lookups_is_dupl :: int, step_statistics :: list(table_step_stats) ). % The definition of this type be an enum whose implementation matches % the type MR_TableTrieStep in runtime/mercury_tabling.h. It should also % be kept in sync with the type table_trie_step in hlds_pred.m. % :- type table_step_kind ---> table_step_dummy ; table_step_int ; table_step_char ; table_step_string ; table_step_float ; table_step_enum ; table_step_foreign_enum ; table_step_general ; table_step_general_addr ; table_step_general_poly ; table_step_general_poly_addr ; table_step_typeinfo ; table_step_typeclassinfo ; table_step_promise_implied ; table_step_int8 ; table_step_uint8 ; table_step_int16 ; table_step_uint16 ; table_step_int32 ; table_step_uint32 ; table_step_int64 ; table_step_uint64. :- type table_step_stats ---> table_step_stats( table_step_var_name :: string, table_step_num_lookups :: int, table_step_num_lookups_is_dupl :: int, table_step_detail :: table_step_stat_details ). :- type table_step_stat_details ---> step_stats_none ; step_stats_start( start_num_node_allocs :: int, start_num_node_bytes :: int ) ; step_stats_enum( enum_num_node_allocs :: int, enum_num_node_bytes :: int ) ; step_stats_hash( hash_num_table_allocs :: int, hash_num_table_bytes :: int, hash_num_link_chunk_allocs :: int, hash_num_link_chunk_bytes :: int, hash_num_num_key_compares_not_dupl :: int, hash_num_num_key_compares_dupl :: int, hash_num_resizes :: int, hash_resizes_num_old_entries :: int, hash_resizes_num_new_entries :: int ) ; step_stats_du( du_num_node_allocs :: int, du_num_node_bytes :: int, du_num_arg_lookups :: int, du_num_exist_lookups :: int, du_enum_num_node_allocs :: int, du_enum_num_node_bytes :: int, du_hash_num_table_allocs :: int, du_hash_num_table_bytes :: int, du_hash_num_link_chunk_allocs :: int, du_hash_num_link_chunk_bytes :: int, du_hash_num_num_key_compares_not_dupl :: int, du_hash_num_num_key_compares_dupl :: int, du_hash_num_resizes :: int, du_hash_resizes_num_old_entries :: int, du_hash_resizes_num_new_entries :: int ) ; step_stats_poly( poly_du_num_node_allocs :: int, poly_du_num_node_bytes :: int, poly_du_num_arg_lookups :: int, poly_du_num_exist_lookups :: int, poly_enum_num_node_allocs :: int, poly_enum_num_node_bytes :: int, poly_hash_num_table_allocs :: int, poly_hash_num_table_bytes :: int, poly_hash_num_link_chunk_allocs :: int, poly_hash_num_link_chunk_bytes :: int, poly_hash_num_num_key_compares_not_dupl :: int, poly_hash_num_num_key_compares_dupl :: int, poly_hash_num_resizes :: int, poly_hash_resizes_num_old_entries :: int, poly_hash_resizes_num_new_entries :: int ). :- func table_stats_difference(table_stats, table_stats) = table_stats. :- pred write_table_stats(table_stats::in, io::di, io::uo) is det. :- pred write_table_stats(io.text_output_stream::in, table_stats::in, io::di, io::uo) is det. % In grades that don't support tabling, all calls to get tabling stats % will return these dummy statistics. % :- func dummy_proc_table_statistics = proc_table_statistics. %--------------------------------------------------%