CPython

RASP CPython 耗时计算

OUT OF DATE 数据已过期,仅供参考。 新测算正在路上

单位ns

函数10万次耗时(ns)RASP部署后 10万次耗时(ns)单次耗时增加(ns)
eval420657664418247940337618.21739
exec476141113427031634837941.75235
open964069073313669611921726.27046
函数1000次耗时(ns)RASP部署后 1000次耗时(ns)单次耗时增加(ns)
os.system16474522181187803549892305832.808
os.popen26730843143271188191598103.877
os.spawnv1912338997385306453391940725.536
函数10000次耗时(ns)RASP部署后 10000次耗时(ns)单次耗时增加(ns)
socket.write80.8235081559999988.310867465999990.007487359310000002
urllib.request.urlopen14046693797329288615511888216.7754
requests.delete1675569102717882416779112672.5752
requests.get2312028859124186248660106596.0069
requests.head1715031659518258220484110790.3889
requests.options1631450505617840175898152567.0842
requests.patch1677821706218071625952129340.889
requests.post170565319381795983664190330.4703
requests.put1672876502617770903809104213.8783
requests.reqeust2300327988024134463809113118.3929
import time
import timeit


class Builtins:
    # avoid timeit using exec
    @staticmethod
    def bench_eval():
        st = time.perf_counter_ns()
        for i in range(100000):
            eval("1024*1024*{}".format(i), globals(), {})
        et = time.perf_counter_ns()
        return et - st

    @staticmethod
    def bench_open():
        st = time.perf_counter_ns()
        for i in range(100000):
            open("/etc/passwd").close()
        et = time.perf_counter_ns()
        return et - st

    @staticmethod
    def bench_exec():
        st = time.perf_counter_ns()
        for i in range(100000):
            exec("1024*1024*{}".format(i), globals(), {})
        et = time.perf_counter_ns()
        return et - st


class Requests():
    @staticmethod
    def bench_get():
        return timeit.timeit(timer=time.perf_counter_ns,
                             setup="import requests",
                             stmt="requests.get('http://localhost/')",
                             number=10000,
                             )

    @staticmethod
    def bench_post():
        return timeit.timeit(timer=time.perf_counter_ns,
                             setup="import requests",
                             stmt="requests.post('http://localhost/')",
                             number=10000,
                             )

    @staticmethod
    def bench_put():
        return timeit.timeit(timer=time.perf_counter_ns,
                             setup="import requests",
                             stmt="requests.put('http://localhost/')",
                             number=10000,
                             )

    @staticmethod
    def bench_head():
        return timeit.timeit(timer=time.perf_counter_ns,
                             setup="import requests",
                             stmt="requests.head('http://localhost/')",
                             number=10000,
                             )

    @staticmethod
    def bench_delete():
        return timeit.timeit(timer=time.perf_counter_ns,
                             setup="import requests",
                             stmt="requests.delete('http://localhost/')",
                             number=10000,
                             )

    @staticmethod
    def bench_options():
        return timeit.timeit(timer=time.perf_counter_ns,
                             setup="import requests",
                             stmt="requests.options('http://localhost/')",
                             number=10000,
                             )

    @staticmethod
    def bench_patch():
        return timeit.timeit(timer=time.perf_counter_ns,
                             setup="import requests",
                             stmt="requests.patch('http://localhost/')",
                             number=10000,
                             )

    @staticmethod
    def bench_reqeust():
        return timeit.timeit(timer=time.perf_counter_ns,
                             setup="import requests",
                             stmt="requests.request('GET', 'http://localhost/')",
                             number=10000,
                             )


class Os:
    @staticmethod
    def bench_system():
        return timeit.timeit(timer=time.perf_counter_ns,
                             setup='import os', stmt='os.system("w > /dev/null")', number=1000
                             )

    @staticmethod
    def bench_popen():
        return timeit.timeit(timer=time.perf_counter_ns,
                             setup="import os",
                             stmt="os.popen('w > /dev/null')", number=1000)

    @staticmethod
    def bench_spawnv():
        return timeit.timeit(timer=time.perf_counter_ns,
                             setup="import os",
                             stmt='os.spawnv(os.P_WAIT, "/bin/w", [">", "/dev/null"])',
                             number=1000)


def setup_rasp(iast=False):
    import rasp
    rasp.setup_var(iast, False)
    rasp.setup_client()
    rasp.hook()


if __name__ == "__main__":
    # print(Builtins.bench_eval())
    # os
    import sys
    point = sys.argv[1]
    if point == "os":
        raw_os_system = Os.bench_system()
        raw_os_popen = Os.bench_popen()
        raw_os_spawnv = Os.bench_spawnv()
        setup_rasp()
        rasp_os_system = Os.bench_system()
        rasp_os_popen = Os.bench_popen()
        rasp_os_spawnv = Os.bench_spawnv()
        print("os.system: ", raw_os_system, rasp_os_system,
              (rasp_os_system-raw_os_system)/1000)
        print("os.popen: ", raw_os_popen, rasp_os_popen,
              (rasp_os_popen-raw_os_popen)/1000)
        print("os.spawnv: ", raw_os_spawnv, rasp_os_spawnv,
              (rasp_os_spawnv-raw_os_spawnv)/1000)
    if point == "builtin":
        raw_eval = Builtins.bench_eval()
        raw_exec = Builtins.bench_exec()
        raw_open = Builtins.bench_open()
        setup_rasp()
        rasp_eval = Builtins.bench_eval()
        rasp_exec = Builtins.bench_exec()
        rasp_open = Builtins.bench_open()
        print("eval:", raw_eval, rasp_eval, (rasp_eval-raw_eval)/100000)
        print("exec:", raw_exec, rasp_exec, (rasp_exec-raw_exec)/100000)
        print("open:", raw_open, rasp_open, (rasp_open-raw_open)/100000)
    if point == "requests":
        requests_bench = [func for func in dir(
            Requests) if func.startswith("bench")]
        print(requests_bench)
        requests_res = {}
        for func in requests_bench:
            res = getattr(Requests, func)()
            print(res)
            requests_res["raw_{}".format(func)] = res
        setup_rasp(iast=True)
        for func in requests_bench:
            res = getattr(Requests, func)()
            print(res)
            requests_res["rasp_{}".format(func)] = res
        for func in requests_bench:
            raw = requests_res.get("raw_{}".format(func))
            rasp = requests_res.get("rasp_{}".format(func))
            print("requests.{}:".format(
                func[6:]), raw, rasp, (rasp-raw)/10000)