我正在尝试对我的硬盘进行基准测试,这就是说计算其延迟(ms)和吞吐量(MB / s)。 为此,我想测量Python函数f.write的执行时间。 我需要的是将x字节写入我的文件。 我知道我需要使用
打开我的文件f = open(file_name, 'wb')
然后我做的是
for i in range(blocksize)
f.write(b'\xff')
然而,我获得的吞吐量(MB / s)的结果太低了。延迟看起来正确。所以我推断的是,当我执行前面的行时,我实际上是在向文件写入多个字节,我正在写一个包含一个字节的字符串... 我知道对象在Python中确实没有大小,但有没有办法解决这个问题?
修改 好的,这里是新的代码,现在结果显得太高了!我的磁盘写入限制应该是100MB / s,但我的结果要快十倍。怎么了? 导入系统 进口时间
f = open("test.txt",'wb+')
def file_write_seq_access(blocksize):
chunk = b'\xff'*4000
for i in range(blocksize//4000):
f.write(chunk)
if __name__ == '__main__':
start_time = time.time()
file_write_seq_access(int(sys.argv[1]))
stop_time = time.time()
diff = stop_time - start_time
print diff, "s"
print (int(sys.argv[1])/diff),"B/s"
答案 0 :(得分:3)
简而言之,Python对于这种逐字节写入来说还不够快,而文件缓冲和类似操作会增加太多开销。
你应该做的就是操作:
import sys
blocksize = int(sys.argv[1])
chunk = b'\xff'*10000
with open("file.file", "wb") as f:
for _ in range(blocksize // 10000):
f.write(chunk)
可能使用PyPy
应该进一步(非常小,可能是负面的)加速。
请注意,操作系统会干扰此处的时间安排,因此会出现很多的差异。使用C可能会更快结束。
在做了一些时间后,这与dd
的速度匹配,因此你不会更快。
答案 1 :(得分:3)
您需要使结果正常的是使用低级I / O来最小化调用时间开销并刷新缓冲区,否则您的写入可能会在某处缓冲(例如,通过您使用的OS)。
from time import perf_counter as time
def write_test(file, block_size, blocks_count):
f = os.open(file, os.O_CREAT|os.O_WRONLY, 0o777) # low-level I/O
took = []
for i in range(blocks_count):
buff = os.urandom(block_size) # get random bytes
start = time()
os.write(f, buff)
os.fsync(f) # force write to disk
t = time() - start
took.append(t)
os.close(f)
return took
该代码是我的业余爱好项目的一部分 - 这是Python中用于对HDD和SSD进行基准测试的简单工具。它是完全开源的,现在处于alpha阶段,虽然你已经可以使用它,如果有兴趣,可以参与开发。希望你能找到一些好的想法,甚至可能提供你的想法。 这是链接:https://github.com/thodnev/MonkeyTest