2008-06-13 Maciej Stachowiak <mjs@apple.com>
authormjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 14 Jun 2008 04:12:45 +0000 (04:12 +0000)
committermjs@apple.com <mjs@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 14 Jun 2008 04:12:45 +0000 (04:12 +0000)
        Reviewed by Oliver.

        - prettify opcode stats output

        I changed things to be a bit more aligned, also there is a new
        section listing most common opcodes and most common sequences that
        include them.

        * VM/Opcode.cpp:
        (KJS::):
        (KJS::OpcodeStats::~OpcodeStats):
        * VM/Opcode.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@34527 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/VM/Opcode.cpp

index 4073905a73b257ab308ac0edb1e6043e73aa0b4f..ced8a1295708c935b31e36f03f34ac4193bb925d 100644 (file)
@@ -1,3 +1,18 @@
+2008-06-13  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Oliver.
+        
+        - prettify opcode stats output
+        
+        I changed things to be a bit more aligned, also there is a new
+        section listing most common opcodes and most common sequences that
+        include them.
+
+        * VM/Opcode.cpp:
+        (KJS::):
+        (KJS::OpcodeStats::~OpcodeStats):
+        * VM/Opcode.h:
+
 2008-06-13  Kevin McCullough  <kmccullough@apple.com>
 
         Reviewed by Geoff.
index 0eb3f5526e25a0e8b8259be75f8308b8ff3c6c7e..be125edab860cd078ddb2f9578759ae08325c215 100644 (file)
@@ -45,91 +45,91 @@ int OpcodeStats::lastOpcode = -1;
 static OpcodeStats logger;
 
 static const char* opcodeNames[] = {
-    "load",
-    "new_object",
-    "new_array",
-    "new_regexp",
-    "mov",
-    
-    "not",
-    "eq",
-    "neq",
-    "stricteq",
-    "nstricteq",
-    "less",
-    "lesseq",
-    
-    "pre_inc",
-    "pre_dec",
-    "post_inc",
-    "post_dec",
-    "to_jsnumber",
-    "negate",
-    "add",
-    "mul",
-    "div",
-    "mod",
-    "sub",
-    
-    "lshift",
-    "rshift",
-    "urshift",
-    "bitand",
-    "bitxor",
-    "bitor",
-    "bitnot",
-    
-    "instanceof",
-    "typeof",
-    "in",
-
-    "resolve",
+    "load        ",
+    "new_object  ",
+    "new_array   ",
+    "new_regexp  ",
+    "mov         ",
+    
+    "not         ",
+    "eq          ",
+    "neq         ",
+    "stricteq    ",
+    "nstricteq   ",
+    "less        ",
+    "lesseq      ",
+    
+    "pre_inc     ",
+    "pre_dec     ",
+    "post_inc    ",
+    "post_dec    ",
+    "to_jsnumber ",
+    "negate      ",
+    "add         ",
+    "mul         ",
+    "div         ",
+    "mod         ",
+    "sub         ",
+    
+    "lshift      ",
+    "rshift      ",
+    "urshift     ",
+    "bitand      ",
+    "bitxor      ",
+    "bitor       ",
+    "bitnot      ",
+    
+    "instanceof  ",
+    "typeof      ",
+    "in          ",
+
+    "resolve     ",
     "resolve_skip",
     "get_scoped_var",
     "put_scoped_var",
     "resolve_base",
     "resolve_with_base",
     "resolve_func",
-    "get_by_id",
-    "put_by_id",
-    "del_by_id",
-    "get_by_val",
-    "put_by_val",
-    "del_by_val",
+    "get_by_id   ",
+    "put_by_id   ",
+    "del_by_id   ",
+    "get_by_val  ",
+    "put_by_val  ",
+    "del_by_val  ",
     "put_by_index",
-    "put_getter",
-    "put_setter",
+    "put_getter  ",
+    "put_setter  ",
 
-    "jmp",
-    "jtrue",
-    "jfalse",
-    "jless",
-    "jmp_scopes",
+    "jmp         ",
+    "jtrue       ",
+    "jfalse      ",
+    "jless       ",
+    "jmp_scopes  ",
 
-    "new_func",
+    "new_func    ",
     "new_func_exp",
-    "call",
-    "call_eval",
-    "ret",
+    "call        ",
+    "call_eval   ",
+    "ret         ",
 
-    "construct",
+    "construct   ",
 
-    "get_pnames",
-    "next_pname",
+    "get_pnames  ",
+    "next_pname  ",
 
-    "push_scope",
-    "pop_scope",
+    "push_scope  ",
+    "pop_scope   ",
 
-    "catch",
-    "throw",
-    "new_error",
+    "catch       ",
+    "throw       ",
+    "new_error   ",
 
-    "jsr",
-    "sret",
+    "jsr         ",
+    "sret        ",
 
-    "debug",
+    "debug       ",
 
-    "end"    
+    "end         "
 };
 
 OpcodeStats::OpcodeStats()
@@ -193,16 +193,19 @@ OpcodeStats::~OpcodeStats()
             *(currentPairIndex++) = make_pair(i, j);
     mergesort(sortedPairIndices, numOpcodeIDs * numOpcodeIDs, sizeof(pair<int, int>), compareOpcodePairIndices);
     
-    printf("\nExecuted opcode statistics:\n\n"); 
+    printf("\nExecuted opcode statistics\n"); 
     
     printf("Total instructions executed: %lld\n\n", totalInstructions);
-    
+
+    printf("All opcodes by frequency:\n\n");
+
     for (int i = 0; i < numOpcodeIDs; ++i) {
         int index = sortedIndices[i];
-        printf("%s: %.2f%%\n", opcodeNames[index], ((double) opcodeCounts[index]) / ((double) totalInstructions) * 100.0);    
+        printf("%s: %lld - %.2f%%\n", opcodeNames[index], opcodeCounts[index], ((double) opcodeCounts[index]) / ((double) totalInstructions) * 100.0);    
     }
     
     printf("\n");
+    printf("2-opcode sequences by frequency: %lld\n\n", totalInstructions);
     
     for (int i = 0; i < numOpcodeIDs * numOpcodeIDs; ++i) {
         pair<int, int> indexPair = sortedPairIndices[i];
@@ -211,10 +214,36 @@ OpcodeStats::~OpcodeStats()
         if (!count)
             break;
         
-        printf("(%s, %s): %.2f%%\n", opcodeNames[indexPair.first], opcodeNames[indexPair.second], ((double) count) / ((double) totalInstructionPairs) * 100.0);
+        printf("%s %s: %lld %.2f%%\n", opcodeNames[indexPair.first], opcodeNames[indexPair.second], count, ((double) count) / ((double) totalInstructionPairs) * 100.0);
     }
     
     printf("\n");
+    printf("Most common opcodes and sequences:\n");
+
+    for (int i = 0; i < numOpcodeIDs; ++i) {
+        int index = sortedIndices[i];
+        long long opcodeCount = opcodeCounts[index];
+        double opcodeProportion = ((double) opcodeCount) / ((double) totalInstructions);
+        if (opcodeProportion < 0.0001)
+            break;
+        printf("\n%s: %lld - %.2f%%\n", opcodeNames[index], opcodeCount, opcodeProportion * 100.0);
+
+        for (int j = 0; j < numOpcodeIDs * numOpcodeIDs; ++j) {
+            pair<int, int> indexPair = sortedPairIndices[j];
+            long long pairCount = opcodePairCounts[indexPair.first][indexPair.second];
+            double pairProportion = ((double) pairCount) / ((double) totalInstructionPairs);
+        
+            if (!pairCount || pairProportion < 0.0001 || pairProportion < opcodeProportion / 100)
+                break;
+
+            if (indexPair.first != index && indexPair.second != index)
+                continue;
+
+            printf("    %s %s: %lld - %.2f%%\n", opcodeNames[indexPair.first], opcodeNames[indexPair.second], pairCount, pairProportion * 100.0);
+        }
+        
+    }
+    printf("\n");
 }
 
 void OpcodeStats::recordInstruction(int opcode)