英文原文:DO YOU KNOW HOW MUCH YOUR COMPUTER CAN DO IN A SECOND?

  让我们来看看你有多么了解电脑!所有这些程序的数值都是可变的。你的任务是:在程序花费 1 秒运行之前猜测它的大概值。

  你并不需要猜出一个精确值:选择范围在 1 和 10 亿之间。你只要能猜出正确的数量级,就算正确!下面是一些注意事项:

  • 如果答案是 38,000,那么你选择 10,000 或 100,000,我们就认为都是正确答案。误差只要在 10 倍范围内就 ok:)
  • 我们知道不同的计算机有不同的磁盘、网络和 CPU 速度!我们会告诉运行 10 次/秒和 10 万次/秒的代码之间的差别。更新的电脑不会让你的代码运行速度快 1000 倍:)
  • 也就是说,所有这一切都是运行在一台新的拥有一个快速的 SSD 和一个凑合的网络连接的笔记本电脑上的。 C 代码用 gcc -O2 编译。

  祝你好运!

欢迎来到第一个程序!这一个只是让你练练手的:1 秒能完成多少循环? (结果可能比你想象得更多!)

  猜猜下面的程序每秒执行多少次循环:

#include <stdlib.h>// Number to guess: How many iterations of
// this loop can we go through in a second?int main (int argc, char **argv) {int NUMBER, i, s;NUMBER = atoi (argv[1]);for (s = i = 0; i < NUMBER; ++i) {s += 1;}return 0;
}

  准确答案:550,000,000

  猜猜下面的程序每秒执行多少次循环:

#!/usr/bin/env python# Number to guess: How many iterations of an
# empty loop can we go through in a second?def f (NUMBER):for _ in xrange (NUMBER):passimport sys
f (int(sys.argv[1]))

  准确答案:68,000,000

  当我看着代码的时候,我想的是 1 毫秒完成多少次——我以为是微不足道的,但事实是,即使是 Python,你也可以在 1 毫秒的时间内执行 68,000 次空循环迭代。

下面让我们来探讨一个更接近现实的用例。在 Python 中字典几乎是无处不在的,那么在 1 秒时间内我们可以用 Python 添加多少元素呢?

然后再来看一个更复杂的操作——使用 Python 的内置 HTTP 请求解析器来解析请求。

  猜猜下面的程序每秒执行多少次循环:

#!/usr/bin/env python# Number to guess: How many entries can
# we add to a dictionary in a second?# Note: we take `i % 1000` to control
# the size of the dictionarydef f (NUMBER):d = {}for i in xrange (NUMBER):d[i % 1000] = iimport sys
f (int(sys.argv[1]))

  准确答案:11,000,000

  猜猜下面的程序每秒处理多少次 HTTP 请求:

#!/usr/bin/env python# Number to guess: How many HTTP requests
# can we parse in a second?from BaseHTTPServer import BaseHTTPRequestHandler
from StringIO import StringIOclass HTTPRequest (BaseHTTPRequestHandler):def __init__(self, request_text):self.rfile = StringIO (request_text)self.raw_requestline = self.rfile.readline ()self.error_code = self.error_message = Noneself.parse_request ()def send_error (self, code, message):self.error_code = codeself.error_message = messagerequest_text = """GET / HTTP/1.1
Host: localhost:8001
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
"""def f (NUMBER):for _ in range (NUMBER):HTTPRequest (request_text)import sys
f (int(sys.argv[1]))

  准确答案:25,000

  我们每秒可以解析 25,000 个小的 HTTP 请求!有一件事我要在这里指出的是,这里请求解析的代码是用纯 Python 编写的,而不是C。

接下来,我们要试试下载网页与运行 Python 脚本!提示:少于 1 亿:)

  猜猜下面的程序每秒可以完成多少次 HTTP 请求:

#!/usr/bin/env python# Number to guess: How many times can we
# download google.com in a second?from urllib2 import urlopendef f (NUMBER):for _ in xrange (NUMBER):r = urlopen ("http://google.com")r.read ()import sys
f (int(sys.argv[1]))

  准确答案:4

  猜猜下面的程序每秒可以执行多少次循环:

#!/bin/bash# Number to guess: How many times can we start
# the Python interpreter in a second?NUMBER=$1for i in $(seq $NUMBER); dopython -c '';
done

  准确答案:77

  启动程序实际上昂贵在其本身,而不是启动 Python。如果我们只是运行/bin/true,那么 1 秒能做 500 次,所以看起来运行任何程序只需要大约 1 毫秒时间。当然,下载网页的快慢很大程度上取决于网页大小,网络连接速度,以及服务器间的距离,不过今天我们不谈网络性能。我的一个朋友说,高性能的网络完成网络往返甚至可能只要 250 纳秒(!!!),但这是在计算机位置更相邻,硬件更好的情况下。

1 秒时间能够在磁盘中写入多少字节?我们都知道写到内存中时速度会更快,但是究竟会快多少呢?对了,下面的代码运行在带有 SSD 的计算机上。

  猜猜下面的程序每秒可以写入多少字节数据:

#!/usr/bin/env python# Number to guess: How many bytes can we write
# to an output file in a second?
# Note: we make sure everything is sync'd to disk
# before exiting
import tempfile
import osCHUNK_SIZE = 1000000
s = "a" * CHUNK_SIZEdef cleanup (f, name):f.flush ()os.fsync (f.fileno ())f.close ()try:os.remove (name)except:passdef f (NUMBER):name = './out'f = open (name, 'w')bytes_written = 0while bytes_written < NUMBER:f.write (s)bytes_written += CHUNK_SIZEcleanup (f, name)import sys
f (int(sys.argv[1]))

  准确答案:342,000,000

  猜猜下面的程序每秒可以写入多少字节数据:

#!/usr/bin/env python# Number to guess: How many bytes can we write
# to a string in memory in a second?import cStringIOCHUNK_SIZE = 1000000
s = "a" * CHUNK_SIZEdef f (NUMBER):output = cStringIO.StringIO ()bytes_written = 0while bytes_written < NUMBER:output.write (s)bytes_written += CHUNK_SIZEimport sys
f (int(sys.argv[1]))

  准确答案:2,000,000,000

下面轮到文件了!有时候,运行一个大型的 grep 之后,它可以永恒跑下去。在 1 秒时间内,grep 可以搜索多少字节?

请注意,在这么做的时候,grep 正在读取的字节已经在内存中。

文件列表同样需要时间!1 秒能列出多少文件?

  猜猜下面的程序每秒可以搜索多少字节的数据:

#!/bin/bash # Number to guess: How many bytes can `grep`
# search, unsuccessfully, in a second?
# Note: the bytes are in memoryNUMBER=$1cat /dev/zero | head -c $NUMBER | grep blah
exit 0

  准确答案:2,000,000,000

  猜猜下面的程序每秒可以列出多少文件:

#!/bin/bash# Number to guess: How many files can `find` list in a second?
# Note: the files will be in the filesystem cache.find / -name '*' 2> /dev/null | head -n $1 > /dev/null

  准确答案:325,000

序列化是一个普遍要花费大量时间的地方,让人很蛋疼,特别是如果你反复结束序列化/反序列化相同数据的时候。这里有几个基准:转换 64K 大小的 JSON 格式数据,与同样大小的 msgpack 格式数据。

  猜猜下面的程序每秒可以执行多少次循环:

#!/usr/bin/env python# Number to guess: How many times can we parse
# 64K of JSON in a second?import jsonwith open ('./setup/protobuf/message.json') as f:message = f.read ()def f (NUMBER):for _ in xrange (NUMBER):json.loads (message)import sys
f (int(sys.argv[1]))

  准确答案:449

  猜猜下面的程序每秒可以执行多少次循环:

#!/usr/bin/env python# Number to guess: How many times can we parse
# 46K of msgpack data in a second?import msgpackwith open ('./setup/protobuf/message.msgpack') as f:message = f.read ()def f (NUMBER):for _ in xrange (NUMBER):msgpack.unpackb (message)import sys
f (int(sys.argv[1]))

  准确答案:4,000

数据库。没有任何类似于 PostgreSQL 花里胡哨的东西,我们做了 2 份有 1000 万行数据的 SQLite 表,一个是有索引的,另一个是未建索引的。

  猜猜下面的程序每秒可以执行多少次查询:

#!/usr/bin/env python# Number to guess: How many times can we
# select a row from an **indexed** table with
# 10,000,000 rows?import sqlite3conn = sqlite3.connect ('./indexed_db.sqlite')
c = conn.cursor ()
def f (NUMBER):query = "select * from my_table where key = %d" % 5for i in xrange (NUMBER):c.execute (query)c.fetchall ()import sys
f (int(sys.argv[1]))

  准确答案:53,000

  猜猜下面的程序每秒执行多少次查询:

#!/usr/bin/env python# Number to guess: How many times can we
# select a row from an **unindexed** table with
# 10,000,000 rows?import sqlite3conn = sqlite3.connect ('./unindexed_db.sqlite')
c = conn.cursor ()
def f (NUMBER):query = "select * from my_table where key = %d" % 5for i in xrange (NUMBER):c.execute (query)c.fetchall ()import sys
f (int(sys.argv[1]))

  准确答案:2

下面要说 Hash 算法!在这里,我们将比较 MD5 和 bcrypt。用 MD5 你在 1 秒时间内可以哈希到相当多的东西,而用 bcrypt 则不能。

  猜猜下面的程序每秒可以哈希多少字节的数据:

#!/usr/bin/env python# Number to guess: How many bytes can we md5sum in a second?import hashlibCHUNK_SIZE = 10000
s = 'a' * CHUNK_SIZEdef f (NUMBER):bytes_hashed = 0h = hashlib.md5()while bytes_hashed < NUMBER:h.update (s)bytes_hashed += CHUNK_SIZEh.digest ()
import sys
f (int(sys.argv[1]))

  准确答案:455,000,000

  猜猜下面的程序每秒可以哈希多少字节的密码:

#!/usr/bin/env python# Number to guess: How many passwords
# can we bcrypt in a second?import bcryptpassword = 'a' * 100def f (NUMBER):for _ in xrange (NUMBER):bcrypt.hashpw (password, bcrypt.gensalt ())import sys
f (int(sys.argv[1]))

  准确答案:3

接下来,我们要说一说内存访问。 现在的 CPU 有 L1 和 L2 缓存,这比主内存访问速度更快。这意味着,循序访问内存通常比不按顺序访问内存能提供更快的代码。

  猜猜下面的程序每秒可以向内存写入多少字节数据:

#include <stdlib.h>
#include <stdio.h>// Number to guess: How big of an array (in bytes)
// can we allocate and fill in a second?// this is intentionally more complicated than it needs to be
// so that it matches the out-of-order versionint main (int argc, char **argv) {int NUMBER, i;NUMBER = atoi (argv[1]);char* array = malloc (NUMBER);int j = 1;for (i = 0; i < NUMBER; ++i) {j = j * 2;if (j > NUMBER) {j = j - NUMBER;}array[i] = j;}printf ("%d", array[NUMBER / 7]);// so that -O2 doesn't optimize out the loopreturn 0;
}

  准确答案:376,000,000

  猜猜下面的程序每秒可以向内存写入多少字节数据:

#include <stdlib.h>
#include <stdio.h>// Number to guess: How big of an array (in bytes)
// can we allocate and fill with 5s in a second?
// The catch: We do it out of order instead of in order.
int main (int argc, char **argv) {int NUMBER, i;NUMBER = atoi (argv[1]);char* array = malloc (NUMBER);int j = 1;for (i = 0; i < NUMBER; ++i) {j = j * 2;if (j > NUMBER) {j = j - NUMBER;}array[j] = j;}printf ("%d", array[NUMBER / 7]);// so that -O2 doesn't optimize out the loopreturn 0;
}

  准确答案:68,000,000

  欢迎大家去试一试,给我们留下宝贵的意见。

  -

  译文链接:http://www.codeceo.com/article/1-second-your-computer-do.html

你知道你的电脑1秒钟能做多少事情吗?(转)相关推荐

  1. 你知道你的电脑 1 秒钟能做多少事情吗?

    让我们来看看你有多么了解电脑!所有这些程序的数值都是可变的.你的任务是:在程序花费1秒运行之前猜测它的大概值. 你并不需要猜出一个精确值:选择范围在1和10亿之间.你只要能猜出正确的数量级,就算正确! ...

  2. MySQL之父Michael Wideneus:有自己的电脑,我可以做任何事情

    MySQL之父Michael Wideneus,在2016云栖大会上受到诸多追捧. 先是微博上,转发超过200,评论超过50条.有人评论:"可怕的不是人家很牛逼,而是人家这么牛逼还比你努力. ...

  3. 新电脑环境下需要做的事情

    下载node.js运行环境 下载地址(http://nodejs.cn/download/) 下载好后可以在命令行输入 node –v 查看node的版本,则知道是否下载成功 在node环境下下载ya ...

  4. 如何在注册表里计算机用户名,可以通过注册表修改电脑的密码 ?怎么做的?

    可以通过注册表修改电脑的密码 ?怎么做的?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 可以通过注册表修改电脑的密码 ...

  5. sql2008“备份集中的数据库备份与现有的xx数据库不同”解决方法 因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库,不让还原,在网上找到下面的方法解决了: 一、右击系

    sql2008"备份集中的数据库备份与现有的xx数据库不同"解决方法 因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库,不让还原,在网上找到下面的方法解决 ...

  6. 软件界面是怎么做出来的_电脑时间管理软件,每天要做的事情会有对话框跳出来提醒的便签软件...

    对于上班族来讲,每天的工作时间大多数都是八小时,在面对繁重的工作任务时,如果不能合理安排这八小时的工作时间,很容易在下班时工作任务还未完成:因此为了提高工作的效率,同时确保在工作时间内完成工作任务,大 ...

  7. 电脑怎么用照片做视频?哪个软件简单好用?3步教你轻松制作!

    现在都流行用照片随手记录生活.而把照片做成视频,又是现在刷爆抖音.朋友圈的形式.不仅有酷炫的图片切换效果,还带有动听的背景音乐,这样精美又吸睛的照片视频,肯定能让你获得超多赞.现在最方便的方式就是直接 ...

  8. 怎么用计算机编写文件,怎样在电脑上写作文做文件

    怎样在电脑上写作文做文件以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 1. 怎样用电脑写作文 1. 打开电脑,在桌面新 ...

  9. 学计算机的能做近视手术吗,长时间盯着电脑,还能做近视手术吗?医生给你正解...

    原标题:长时间盯着电脑,还能做近视手术吗?医生给你正解 说实话,在这个数字化时代,有非常非常多的工作需要面对着电脑进行.即使不用对着电脑,手机也是离不开的工作沟通工具.好多想做近视手术的朋友回头一看自 ...

最新文章

  1. 从文本中提取知识图谱代码比较好的,代码对齐,可以使用的
  2. ORACLE告警日志
  3. matlab 读取fig数据
  4. 关于VMware虚拟机的上网
  5. 多语言应用开发中本地化信息对照表
  6. Linux 发行版之 CentOS 简介
  7. 边缘计算 ai_在边缘探索AI!
  8. 数字货币交易所_数字货币交易所开发运营的盈利模式
  9. linux中df和ls区别,linux系统文件大小ls、df、du命令的区别
  10. fourinone分布式协调设计解析
  11. Window系统 安装TFLearn
  12. 小知识---批量修改文件名后缀
  13. solr 配置多个entity_solr建索引优化
  14. python爬虫难度排行榜_无聊写了一个python爬虫程序,用来爬夕阳试炼场排行榜的...
  15. Unity学习资料收集
  16. html给图片添加边框
  17. Spire.XLS的使用
  18. 【MOOC】计算机网络与通信技术笔记(北交)(3)数据链路层
  19. 打开PowerPoint提示:PowerPoint上次起送时失败。以安全模式启动PowperPoint将帮助您纠正或发现启动中的问题
  20. 【前端灵魂脚本语言JavaScript⑤】——JS中数组的使用

热门文章

  1. IDEA在当前类中查找方法快捷键
  2. 销售数据分析怎么做?这篇文章说清楚了
  3. Video321(高清录屏)-团队管理案例分享
  4. Android gradle编译错误OOM:java heap space的解决办法
  5. vue往数组中添加元素_vuejs给数组添加元素
  6. 加油站的智慧转型,你感受到了吗?
  7. 七、C语言创建桌面程序:CreateFont创建自己的字体
  8. Oracle的学习心得和知识总结(六)|Oracle数据库同义词技术详解
  9. [iOS 代码混要加固转帖]
  10. 阿里云轻量应用服务器最新价格表(2023更新)