blob: dbb061573048ccb7980bf50f830d68bc58c065c6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Alexander Astapchuk
*/
/**
* @file
* @brief Implementation of statistics utilities declared in stats.h.
*/
#include <stdio.h>
#include <assert.h>
#include <vector>
#include <algorithm>
#include "stats.h"
#include "trace.h"
namespace Jitrino {
namespace Jet {
// Variables placed on new line to avoid Doxygen warning "
// 'Found ';' while parsing initializer list!'
STATS_ITEM(unsigned)
Stats::methodsCompiled = 0;
STATS_ITEM(unsigned)
Stats::methodsCompiledSeveralTimes = 0;
STATS_ITEM(unsigned)
Stats::methodsWOCatchHandlers = 0;
STATS_ITEM(unsigned)
Stats::opcodesSeen[OPCODE_COUNT];
STATS_ITEM(unsigned)
Stats::npesEliminated = 0;
STATS_ITEM(unsigned)
Stats::npesPerformed = 0;
const char * Stats::g_name_filter = NULL;
DEF_MIN_MAX_VALUE(bc_size);
DEF_MIN_MAX_VALUE(code_size);
DEF_MIN_MAX_VALUE(native_per_bc_ratio);
DEF_MIN_MAX_VALUE(jstack);
DEF_MIN_MAX_VALUE(locals);
DEF_MIN_MAX_VALUE(bbs);
DEF_MIN_MAX_VALUE(bb_size);
DEF_MIN_MAX_VALUE(patchItemsToBcSizeRatioX1000);
#ifdef JIT_STATS
bool opcode_stat_comparator(const ::std::pair<unsigned, unsigned>& one,
const ::std::pair<unsigned, unsigned>& two)
{
return one.first > two.first;
}
void Stats::dump(void)
{
dbg("\n");
#if 0 // takes too many space on console, rarely used. uncomment when needed
//
// Dump how many opcode were seen
//
// a .first is counter, .second is JavaByteCodes value
::std::vector< ::std::pair<unsigned, unsigned> > bclist;
for( unsigned i=0; i<OPCODE_COUNT; i++ ) {
if( opcodesSeen[i] == 0 ) continue;
bclist.push_back( ::std::pair<unsigned, unsigned>(opcodesSeen[i], i) );
};
::std::sort( bclist.begin(), bclist.end(), opcode_stat_comparator );
const unsigned COLS = 3;
const unsigned ROWS = (bclist.size()+COLS-1)/COLS;
unsigned totalInsts = 0;
for( unsigned i=0; i<ROWS; i++ ) {
char buf[1024] = {0}, tmp[100];
const unsigned row_start = i;
for( unsigned j=0; j<COLS; j++ ) {
tmp[0] = '\0';
unsigned idx = row_start + ROWS*j;
if( idx >= OPCODE_COUNT || idx >= bclist.size() ) continue;
unsigned opcode = bclist[idx].second;
sprintf(tmp, "|%-15s%10u", instrs[opcode].name, bclist[idx].first);
strcat(buf, tmp);
totalInsts += bclist[idx].first;
}
dbg("%s|\n", buf);
}
dbg("Instructions total: %u\n", totalInsts);
#endif // if 0
//
//
//
dbg("Total methods compiled : %d\n", methodsCompiled);
dbg("compiled several times : %d\n", methodsCompiledSeveralTimes);
dbg("Methods without catch handlers: %u\n", methodsWOCatchHandlers);
if (!methodsCompiled) {
methodsCompiled = 1; // to avoid many checks for div-by-zero below
}
dbg("NPE checks eliminated : %d\n", npesEliminated);
dbg("NPE checks performed : %d\n", npesPerformed);
#define PRINT_MIN_MAX_VALUE( what ) \
dbg("%-20s max=%9u | average=%9u | min=%9u | total=%9u\n", \
#what ":", what##_max, what##_total/methodsCompiled, what##_min, what##_total);
PRINT_MIN_MAX_VALUE(bc_size);
PRINT_MIN_MAX_VALUE(code_size);
PRINT_MIN_MAX_VALUE(native_per_bc_ratio);
PRINT_MIN_MAX_VALUE(jstack);
PRINT_MIN_MAX_VALUE(locals);
PRINT_MIN_MAX_VALUE(bbs);
PRINT_MIN_MAX_VALUE(bb_size);
PRINT_MIN_MAX_VALUE(patchItemsToBcSizeRatioX1000);
if (NULL == g_name_filter) {
dbg("no name filtering\n");
}
else {
dbg("name filter: %s\n", g_name_filter);
}
};
#endif //#ifdef JIT_STATS
}}; // ~namespace Jitrino::Jet