duke@435: /* stefank@2314: * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. duke@435: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@435: * duke@435: * This code is free software; you can redistribute it and/or modify it duke@435: * under the terms of the GNU General Public License version 2 only, as duke@435: * published by the Free Software Foundation. duke@435: * duke@435: * This code is distributed in the hope that it will be useful, but WITHOUT duke@435: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@435: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@435: * version 2 for more details (a copy is included in the LICENSE file that duke@435: * accompanied this code). duke@435: * duke@435: * You should have received a copy of the GNU General Public License version duke@435: * 2 along with this work; if not, write to the Free Software Foundation, duke@435: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@435: * trims@1907: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA trims@1907: * or visit www.oracle.com if you need additional information or have any trims@1907: * questions. duke@435: * duke@435: */ duke@435: stefank@2314: #ifndef SHARE_VM_INTERPRETER_BYTECODEHISTOGRAM_HPP stefank@2314: #define SHARE_VM_INTERPRETER_BYTECODEHISTOGRAM_HPP stefank@2314: stefank@2314: #include "interpreter/bytecodes.hpp" stefank@2314: #include "memory/allocation.hpp" stefank@2314: duke@435: // BytecodeCounter counts the number of bytecodes executed duke@435: duke@435: class BytecodeCounter: AllStatic { duke@435: private: duke@435: NOT_PRODUCT(static int _counter_value;) duke@435: NOT_PRODUCT(static jlong _reset_time;) duke@435: duke@435: friend class TemplateInterpreterGenerator; duke@435: friend class BytecodeInterpreter; duke@435: duke@435: public: duke@435: // Initialization duke@435: static void reset() PRODUCT_RETURN; duke@435: duke@435: // Counter info (all info since last reset) duke@435: static int counter_value() PRODUCT_RETURN0 NOT_PRODUCT({ return _counter_value; }); duke@435: static double elapsed_time() PRODUCT_RETURN0; // in seconds duke@435: static double frequency() PRODUCT_RETURN0; // bytecodes/seconds duke@435: duke@435: // Counter printing duke@435: static void print() PRODUCT_RETURN; duke@435: }; duke@435: duke@435: duke@435: // BytecodeHistogram collects number of executions of bytecodes duke@435: duke@435: class BytecodeHistogram: AllStatic { duke@435: private: duke@435: NOT_PRODUCT(static int _counters[Bytecodes::number_of_codes];) // a counter for each bytecode duke@435: duke@435: friend class TemplateInterpreterGenerator; duke@435: friend class InterpreterGenerator; duke@435: friend class BytecodeInterpreter; duke@435: duke@435: public: duke@435: // Initialization duke@435: static void reset() PRODUCT_RETURN; // reset counters duke@435: duke@435: // Profile printing duke@435: static void print(float cutoff = 0.01F) PRODUCT_RETURN; // cutoff in percent duke@435: }; duke@435: duke@435: duke@435: // BytecodePairHistogram collects number of executions of bytecode pairs. duke@435: // A bytecode pair is any sequence of two consequtive bytecodes. duke@435: duke@435: class BytecodePairHistogram: AllStatic { duke@435: public: // for SparcWorks duke@435: enum Constants { duke@435: log2_number_of_codes = 8, // use a power of 2 for faster addressing duke@435: number_of_codes = 1 << log2_number_of_codes, // must be no less than Bytecodes::number_of_codes duke@435: number_of_pairs = number_of_codes * number_of_codes duke@435: }; duke@435: duke@435: private: duke@435: NOT_PRODUCT(static int _index;) // new bytecode is shifted in - used to index into _counters duke@435: NOT_PRODUCT(static int _counters[number_of_pairs];) // a counter for each pair duke@435: duke@435: friend class TemplateInterpreterGenerator; duke@435: friend class InterpreterGenerator; duke@435: duke@435: public: duke@435: // Initialization duke@435: static void reset() PRODUCT_RETURN; // reset counters duke@435: duke@435: // Profile printing duke@435: static void print(float cutoff = 0.01F) PRODUCT_RETURN; // cutoff in percent duke@435: }; stefank@2314: stefank@2314: #endif // SHARE_VM_INTERPRETER_BYTECODEHISTOGRAM_HPP