Mercurial > hg > truffle
view graal/com.oracle.graal.debug/src/com/oracle/graal/debug/internal/DebugHistogramImpl.java @ 9103:e7541d478e38
Added DebugHistory utility and corresponding unit tests.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Sat, 13 Apr 2013 17:55:43 +0200 |
parents | |
children | 3495149b9531 |
line wrap: on
line source
/* * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.oracle.graal.debug.internal; import java.io.*; import java.util.*; import com.oracle.graal.debug.*; public class DebugHistogramImpl implements DebugHistogram { public static final int NumberSize = 10; public static final int DefaultNameSize = 50; public static final int DefaultBarSize = 100; private final String name; private HashMap<Object, Integer> map = new HashMap<>(); public DebugHistogramImpl(String name) { this.name = name; } public void add(Object value) { if (!map.containsKey(value)) { map.put(value, 1); } else { map.put(value, map.get(value) + 1); } } @Override public String getName() { return name; } @Override public void print(PrintStream os) { print(os, Integer.MAX_VALUE, DefaultNameSize, DefaultBarSize); } public void print(PrintStream os, int limit, int nameSize, int barSize) { List<Object> list = new ArrayList<>(map.keySet()); if (list.size() == 0) { // No elements in the histogram. os.printf("%s is empty.\n", name); return; } // Sort from highest to smallest. Collections.sort(list, new Comparator<Object>() { @Override public int compare(Object o1, Object o2) { return map.get(o2) - map.get(o1); } }); // Sum up the total number of elements. int total = 0; for (Object o : list) { total += map.get(o); } // Print header. os.printf("%s has %d unique elements and %d total elements:\n", name, list.size(), total); int max = map.get(list.get(0)); final int lineSize = nameSize + NumberSize + barSize + 10; printLine(os, '-', lineSize); String formatString = "| %-" + nameSize + "s | %-" + NumberSize + "d | %-" + barSize + "s |\n"; for (int i = 0; i < list.size() && i < limit; ++i) { Object o = list.get(i); int value = map.get(o); char[] bar = new char[(int) (((double) value / (double) max) * barSize)]; Arrays.fill(bar, '='); os.printf(formatString, o, value, new String(bar)); } printLine(os, '-', lineSize); } private static void printLine(PrintStream printStream, char c, int lineSize) { char[] charArr = new char[lineSize]; Arrays.fill(charArr, c); printStream.printf("%s\n", new String(charArr)); } }