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

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

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

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

祝你好运!

?

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

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

加群923414804免费获取数十套PDF资料

#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):
        pass

import 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 dictionary

def f(NUMBER):
    d = {}
    for i in xrange(NUMBER):
        d[i % 1000] = i

import 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 StringIO

class HTTPRequest(BaseHTTPRequestHandler):
    def __init__(self, request_text):
        self.rfile = StringIO(request_text)
        self.raw_requestline = self.rfile.readline()
        self.error_code = self.error_message = None
        self.parse_request()

    def send_error(self, code, message):
        self.error_code = code
        self.error_message = message

request_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 urlopen

def 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=$1

for i in $(seq $NUMBER); do
    python -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 os

CHUNK_SIZE = 1000000
s = "a" * CHUNK_SIZE

def cleanup(f, name):
    f.flush()
    os.fsync(f.fileno())
    f.close()
    try:
        os.remove(name)
    except:
        pass

def f(NUMBER):
    name = ‘./out‘
    f = open(name, ‘w‘)
    bytes_written = 0
    while bytes_written < NUMBER:
        f.write(s)
        bytes_written += CHUNK_SIZE
    cleanup(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 cStringIO

CHUNK_SIZE = 1000000
s = "a" * CHUNK_SIZE

def f(NUMBER):
    output = cStringIO.StringIO()
    bytes_written = 0
    while bytes_written < NUMBER:
        output.write(s)
        bytes_written += CHUNK_SIZE

import 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 memory

NUMBER=$1

cat /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 json

with 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 msgpack

with 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 sqlite3

conn = sqlite3.connect(‘./indexed_db.sqlite‘)
c = conn.cursor()
def f(NUMBER):
    query = "select * from my_table where key = %d" % 5
    for 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 sqlite3

conn = sqlite3.connect(‘./unindexed_db.sqlite‘)
c = conn.cursor()
def f(NUMBER):
    query = "select * from my_table where key = %d" % 5
    for 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 hashlib

CHUNK_SIZE = 10000
s = ‘a‘ * CHUNK_SIZE

def f(NUMBER):
    bytes_hashed = 0
    h = hashlib.md5()
    while bytes_hashed < NUMBER:
        h.update(s)
        bytes_hashed += CHUNK_SIZE
    h.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 bcrypt

password = ‘a‘ * 100

def 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 version

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[i] = j;
    }

    printf("%d", array[NUMBER / 7]);
    // so that -O2 doesn‘t optimize out the loop

    return 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 loop

    return 0;
}

准确答案:68,000,000

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

原文地址:https://www.cnblogs.com/paisenpython/p/10281203.html

时间: 2024-11-11 01:07:54

你知道你的电脑 1 秒钟能做多少事情吗?的相关文章

【转】教你如何把家用电脑IP地址固定做服务器

什么是端口映射?端口映射又称端口转发.端口映射过程就如同你家在一个小区里B栋2410室,你朋友来找你,找到小区门口,不知道你住哪层哪号?就问守门的保安,保安很客气的告诉了他你家详细门牌号,这样你朋友很轻松的找到了你家.这个过程就是外网访问内网通过端口映射的形象说法.为什么要做端口映射?目前的网络接入主要有2种:1.ADSL 连接猫再直接连接主机,这种情况主机是直接进行ADSL宽带拨号,连接上网通过运行CMD执行ipconfig /all命令可以查看到,PPP拨号连接所获取到得是一个公网IP地址,

电脑注册表是做什么的?怎么清理注册表中的垃圾文件?

注册表是Windows系统中非常重要的一个内容,里面存储着许多重要的数据,当然也会产生很多垃圾文件,从而占用电脑的内存空间.定期的清理注册表可以对电脑进行"瘦身",加快电脑的运行效率.但是清理注册表一定要采用科学的方法,否则可能会影响软件程序的运行,甚至导致系统的瘫痪.下面就为大家介绍一下注册表的相关内容.电脑注册表是什么?注册表英文名是Registry,也叫登录档,是Microsoft Windows系统中的一个重要的数据库,用于存储系统和应用程序的设置信息.意思就是,如果你安装了一

【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-终端源码

[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-终端源码 广东职业技术学院 欧浩源 一.关于硬件电路 关于这个综合实训案例,具体需求详见<[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-题目需求>. 我自己实在"全国职业院校技能大赛--物联网技术应用赛项"的Zigbee模块上实现的.该模块的电路应该和TI公司官方评估板的推荐电路差不多,我想现在市面上很多开发板也是参考这样的电路设计,只要您使用的开发板上有LED灯.按键输入.串口输出和一路A/

计算机启动过程详解

计算机启动过程详解打开电源启动机器几乎是电脑爱好者每天必做的事情,面对屏幕上出现的一幅幅启动画面,我们一点儿也不会感到陌生,但是,计算机在显示这些启动画面时都做了些什么工作呢?相信有的朋友还不是很清楚,本文就来介绍一下从打开电源到出现Windows的蓝天白云时,计算机到底都干了些什么事情.  首先让我们来了解一些基本概念.第一个是大家非常熟悉的BIOS(基本输入输出系统),BIOS是直接与硬件打交道的底层代码,它为操作系统提供了控制硬件设备的基本功能.BIOS包括有系统BIOS(即常说的主板BI

汉澳sinox视窗手机

用了一段时间手机,觉得不太喜欢.比如程序没有关闭按钮,要关闭一个程序,要按几次下面的按钮,甚至还关不掉,比如百度音乐,我最后只好用程序管理器关门所有程序. 我不知道为什么要这样,其实程序也可以有标题栏,按×按钮直接关闭就好了,为何还要按下面的取消按钮呢?不是多此一举吗.本来屏幕触摸屏就能操作手机,为何要用下面按钮?不直观.可能以前程序为了省空间,现在是大屏时代,不需要下面两个按钮了.而且我觉得任务栏也可以恢复了,让用户了解那些程序正在运行,切换程序也容易,不需运行程序管理器,多麻烦. 我认为汉澳

python 学习之电脑的发展历史

电脑的发展历史 电脑的学名叫计算机,电脑是用来做计算的.在古时候,人们最早使用的计算工具可能是手指,英文单词“digit”既有“数字”的意思,又有“手指“的意思.古人用石头打猎,所以还有可能是石头来辅助计算.  缺点:手指和石头太低效了 后来出现了”结绳 “记事.   缺点:结绳慢,绳子还有长度限制. 又不知过了多久,许多国家的人开始使用”筹码“来计数,最有名的就要数咱们中国商周时期出现的算筹了.古代的算筹实际上是一根根同样长短和粗细的小棍子,大约二百七十几枚为一束; 多用竹子制成,也有用木头.

手机变为电脑的摄像头,使像素高清起来-使用DroidCam

你是不是已经在嫌弃电脑自带的摄像头的渣渣像素呢? 今天给大家安利一个方法:将手机摄像头设置为电脑的摄像头,让像素高清起来,对于搞图像的同志们真是福音啊,尤其是做人脸识别的时候. 方法有很多种,我推荐我在用的一个:DroidCam. 手机端.电脑端都装上它. 软件截图: (手机端) (电脑端) 反正现在做人脸识别方便多了.在OpenCV调用的时候: capture = cvCaptureFromCAM(0);//使用第0个摄像头 只需要调用这个摄像头就可以了.快捷的设置,可以在QQ里面设置: 软件

转载:华为的IPD,我在朋友的电脑上也看过这个资料

IPD – 集成产品开发,华为花重金从IBM购买的一套产品集成开发流程,业界有一本书,PACE讲的就是这一套IPD流程,而IPD并不去讲你的开发要怎么做,IPD做的就是“投资决策.市场驱动”,更多的是决定做不做这个事情,做这个事情对于投资人员是不是受控的,所以在IPD里面会有DCP点(决策评审点),每个点上都会去考虑该不该做.值不值得去做,在引入这个东西以前,华为实际上是技术驱动的,并不是市场驱动的,就是说以前华为听说有个新技术,然后就开始做,做了很多这样的东西,但是后来都卖不出去,所以后来就引

新一轮超强电脑病毒来袭 网络安全概念股逆市走强

28日讯,网络安全概念股逆市走强,北信源.任子行涨逾4%,蓝盾股份.格尔软件.美亚柏科等个股涨逾25. 据央视报道,新一轮超强电脑病毒正在包括俄罗斯.英国.乌克兰等在内的欧洲多个国家迅速蔓延.有机场.银行及大型企业被报告感染病毒.报道称,这轮病毒足以与五月席卷全球的勒索病毒的攻击性相提并论. ?乌克兰副总理在社交媒体贴出自己的电脑中毒后的屏幕内容.(据BBC) 相关阅读: 新勒索软件再次席卷全球网络安全望获关注 本周二,全球再次出现大规模网络攻击事件,一些企业的计算机遭到破坏,包括俄罗斯最大的石