Nguyen Anh Quynh | 6d50dc3 | 2014-01-07 11:32:40 +0800 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | |
| 3 | # Simple benchmark for Capstone by disassembling random code. By Nguyen Anh Quynh, 2014 |
Nguyen Anh Quynh | f48a879 | 2014-01-13 16:25:36 +0800 | [diff] [blame] | 4 | # Syntax: |
| 5 | # ./suite/benchmark.py --> Benchmark all archs |
| 6 | # ./suite/benchmark.py x86 --> Benchmark all X86 (all 16bit, 32bit, 64bit) |
| 7 | # ./suite/benchmark.py x86-32 --> Benchmark X86-32 arch only |
| 8 | # ./suite/benchmark.py arm --> Benchmark all ARM (arm, thumb) |
| 9 | # ./suite/benchmark.py aarch64 --> Benchmark ARM-64 |
| 10 | # ./suite/benchmark.py mips --> Benchmark all Mips (32bit, 64bit) |
| 11 | # ./suite/benchmark.py ppc --> Benchmark PPC |
Nguyen Anh Quynh | 6d50dc3 | 2014-01-07 11:32:40 +0800 | [diff] [blame] | 12 | |
| 13 | from capstone import * |
| 14 | |
| 15 | from time import time |
| 16 | from random import randint |
Nguyen Anh Quynh | f48a879 | 2014-01-13 16:25:36 +0800 | [diff] [blame] | 17 | import sys |
Nguyen Anh Quynh | 6d50dc3 | 2014-01-07 11:32:40 +0800 | [diff] [blame] | 18 | |
| 19 | |
Nguyen Anh Quynh | 34474f8 | 2014-01-13 14:49:55 +0800 | [diff] [blame] | 20 | # file providing code to disassemble |
| 21 | FILE = '/usr/bin/python' |
Nguyen Anh Quynh | 6d50dc3 | 2014-01-07 11:32:40 +0800 | [diff] [blame] | 22 | |
Nguyen Anh Quynh | 34474f8 | 2014-01-13 14:49:55 +0800 | [diff] [blame] | 23 | |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 24 | all_tests = ( |
Nguyen Anh Quynh | 07b2037 | 2014-03-04 12:19:49 +0800 | [diff] [blame] | 25 | (CS_ARCH_X86, CS_MODE_16, "X86-16 (Intel syntax)", 0), |
| 26 | (CS_ARCH_X86, CS_MODE_32, "X86-32 (ATT syntax)", CS_OPT_SYNTAX_ATT), |
Nguyen Anh Quynh | f48a879 | 2014-01-13 16:25:36 +0800 | [diff] [blame] | 27 | (CS_ARCH_X86, CS_MODE_32, "X86-32 (Intel syntax)", 0), |
| 28 | (CS_ARCH_X86, CS_MODE_64, "X86-64 (Intel syntax)", 0), |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 29 | (CS_ARCH_ARM, CS_MODE_ARM, "ARM", 0), |
Nguyen Anh Quynh | f48a879 | 2014-01-13 16:25:36 +0800 | [diff] [blame] | 30 | (CS_ARCH_ARM, CS_MODE_THUMB, "THUMB (ARM)", 0), |
Nguyen Anh Quynh | d83c8c7 | 2014-11-17 17:38:18 +0800 | [diff] [blame] | 31 | (CS_ARCH_MIPS, CS_MODE_MIPS32 + CS_MODE_BIG_ENDIAN, "MIPS-32 (Big-endian)", 0), |
| 32 | (CS_ARCH_MIPS, CS_MODE_MIPS64 + CS_MODE_LITTLE_ENDIAN, "MIPS-64-EL (Little-endian)", 0), |
Nguyen Anh Quynh | f48a879 | 2014-01-13 16:25:36 +0800 | [diff] [blame] | 33 | (CS_ARCH_ARM64, CS_MODE_ARM, "ARM-64 (AArch64)", 0), |
Nguyen Anh Quynh | 07b2037 | 2014-03-04 12:19:49 +0800 | [diff] [blame] | 34 | (CS_ARCH_PPC, CS_MODE_BIG_ENDIAN, "PPC", 0), |
| 35 | (CS_ARCH_PPC, CS_MODE_BIG_ENDIAN, "PPC, print register with number only", CS_OPT_SYNTAX_NOREGNAME), |
Nguyen Anh Quynh | 61b7a72 | 2014-03-10 15:44:48 +0800 | [diff] [blame] | 36 | (CS_ARCH_SPARC, CS_MODE_BIG_ENDIAN, "Sparc", 0), |
Nguyen Anh Quynh | 61aaabb | 2014-03-23 22:56:38 +0800 | [diff] [blame] | 37 | (CS_ARCH_SYSZ, 0, "SystemZ", 0), |
Nguyen Anh Quynh | 6a5cc57 | 2014-06-17 18:17:26 +0800 | [diff] [blame] | 38 | (CS_ARCH_XCORE, 0, "XCore", 0), |
Daniel Collin | 2ee675c | 2015-08-03 18:45:08 +0200 | [diff] [blame] | 39 | (CS_ARCH_M68K, 0, "M68K", 0), |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 40 | ) |
| 41 | |
| 42 | |
Nguyen Anh Quynh | 11b0519 | 2014-01-22 11:04:25 +0800 | [diff] [blame] | 43 | # for debugging |
| 44 | def to_hex(s): |
| 45 | return " ".join("0x" + "{0:x}".format(ord(c)).zfill(2) for c in s) # <-- Python 3 is OK |
| 46 | |
Nguyen Anh Quynh | 34474f8 | 2014-01-13 14:49:55 +0800 | [diff] [blame] | 47 | def get_code(f, size): |
| 48 | code = f.read(size) |
| 49 | if len(code) != size: # reached end-of-file? |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 50 | # then reset file position to begin-of-file |
Nguyen Anh Quynh | 34474f8 | 2014-01-13 14:49:55 +0800 | [diff] [blame] | 51 | f.seek(0) |
| 52 | code = f.read(size) |
| 53 | |
| 54 | return code |
| 55 | |
| 56 | |
| 57 | def cs(md, code): |
| 58 | insns = md.disasm(code, 0) |
Nguyen Anh Quynh | 6d50dc3 | 2014-01-07 11:32:40 +0800 | [diff] [blame] | 59 | # uncomment below line to speed up this function 200 times! |
| 60 | # return |
| 61 | for i in insns: |
| 62 | if i.address == 0x100000: |
| 63 | print i |
| 64 | |
Nguyen Anh Quynh | 34474f8 | 2014-01-13 14:49:55 +0800 | [diff] [blame] | 65 | |
Nguyen Anh Quynh | d53c165 | 2014-02-20 12:10:24 +0800 | [diff] [blame] | 66 | def cs_lite(md, code): |
| 67 | insns = md.disasm_lite(code, 0) |
Nguyen Anh Quynh | d53c165 | 2014-02-20 12:10:24 +0800 | [diff] [blame] | 68 | for (addr, size, mnem, ops) in insns: |
| 69 | if addr == 0x100000: |
| 70 | print i |
| 71 | |
| 72 | |
Nguyen Anh Quynh | 34474f8 | 2014-01-13 14:49:55 +0800 | [diff] [blame] | 73 | cfile = open(FILE) |
| 74 | |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 75 | for (arch, mode, comment, syntax) in all_tests: |
Nguyen Anh Quynh | f48a879 | 2014-01-13 16:25:36 +0800 | [diff] [blame] | 76 | try: |
| 77 | request = sys.argv[1] |
| 78 | if not request in comment.lower(): |
| 79 | continue |
| 80 | except: |
| 81 | pass |
| 82 | |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 83 | print("Platform: %s" %comment) |
Nguyen Anh Quynh | 6d50dc3 | 2014-01-07 11:32:40 +0800 | [diff] [blame] | 84 | |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 85 | try: |
| 86 | md = Cs(arch, mode) |
Nguyen Anh Quynh | 321163b | 2014-02-19 10:51:10 +0800 | [diff] [blame] | 87 | #md.detail = True |
Nguyen Anh Quynh | 3079ed6 | 2014-01-09 08:20:38 +0800 | [diff] [blame] | 88 | |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 89 | if syntax != 0: |
| 90 | md.syntax = syntax |
Nguyen Anh Quynh | 6d50dc3 | 2014-01-07 11:32:40 +0800 | [diff] [blame] | 91 | |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 92 | # warm up few times |
| 93 | cfile.seek(0) |
| 94 | for i in xrange(3): |
| 95 | code = get_code(cfile, 128) |
Nguyen Anh Quynh | 11b0519 | 2014-01-22 11:04:25 +0800 | [diff] [blame] | 96 | #print to_hex(code) |
| 97 | #print |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 98 | cs(md, code) |
Nguyen Anh Quynh | 6d50dc3 | 2014-01-07 11:32:40 +0800 | [diff] [blame] | 99 | |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 100 | # start real benchmark |
| 101 | c_t = 0 |
| 102 | for i in xrange(50000): |
| 103 | code = get_code(cfile, 128) |
Nguyen Anh Quynh | 11b0519 | 2014-01-22 11:04:25 +0800 | [diff] [blame] | 104 | #print to_hex(code) |
| 105 | #print |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 106 | |
| 107 | t1 = time() |
| 108 | cs(md, code) |
| 109 | c_t += time() - t1 |
| 110 | |
Nguyen Anh Quynh | d53c165 | 2014-02-20 12:10:24 +0800 | [diff] [blame] | 111 | print "Benchmark - full obj:", c_t, "seconds" |
| 112 | print |
| 113 | |
| 114 | cfile.seek(0) |
| 115 | c_t = 0 |
| 116 | for i in xrange(50000): |
| 117 | code = get_code(cfile, 128) |
| 118 | #print to_hex(code) |
| 119 | #print |
| 120 | |
| 121 | t1 = time() |
| 122 | cs_lite(md, code) |
| 123 | c_t += time() - t1 |
| 124 | |
| 125 | print "Benchmark - lite:", c_t, "seconds" |
Nguyen Anh Quynh | 783e6c0 | 2014-01-13 15:55:12 +0800 | [diff] [blame] | 126 | print |
| 127 | except CsError as e: |
| 128 | print("ERROR: %s" %e) |