/*
* Copyright (c) 2013-2016 Chris Newland.
* Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD
* Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki
*/
package org.adoptopenjdk.jitwatch.jarscan.instructioncount;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_NEWLINE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_COMMA;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import org.adoptopenjdk.jitwatch.jarscan.IJarScanOperation;
import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeInstruction;
import org.adoptopenjdk.jitwatch.model.bytecode.MemberBytecode;
import org.adoptopenjdk.jitwatch.model.bytecode.Opcode;
public class InstructionCountOperation implements IJarScanOperation
{
private Map<Opcode, Integer> opcodeCountMap;
private int limit;
public InstructionCountOperation(int limit)
{
opcodeCountMap = new EnumMap<>(Opcode.class);
this.limit = limit;
}
@Override
public String getReport()
{
StringBuilder builder = new StringBuilder();
List<Map.Entry<Opcode, Integer>> sortedList = new ArrayList<>(opcodeCountMap.entrySet());
Collections.sort(sortedList, new Comparator<Map.Entry<Opcode, Integer>>()
{
@Override
public int compare(Map.Entry<Opcode, Integer> o1, Map.Entry<Opcode, Integer> o2)
{
return o2.getValue().compareTo(o1.getValue());
}
});
int outputCount = 0;
for (Map.Entry<Opcode, Integer> entry : sortedList)
{
Opcode opcode = entry.getKey();
Integer count = entry.getValue();
builder.append(opcode.getMnemonic()).append(C_COMMA);
builder.append(count).append(S_NEWLINE);
outputCount++;;
if (limit != 0 && outputCount == limit)
{
break;
}
}
return builder.toString();
}
private void count(Opcode opcode)
{
Integer count = opcodeCountMap.get(opcode);
if (count == null)
{
count = new Integer(1);
}
else
{
count++;
}
opcodeCountMap.put(opcode, count);
}
@Override
public void processInstructions(String className, MemberBytecode memberBytecode)
{
List<BytecodeInstruction> instructions = memberBytecode.getInstructions();
for (BytecodeInstruction instruction : instructions)
{
Opcode opcode = instruction.getOpcode();
count(opcode);
}
}
}