利用位操作符加速程序的运行

众所周知,位操作是cpu里面最快速的操作之一。但是以前在程序中,一直没有使用,可能是害怕异或是别的什么原因。可是最近在写一个小的爬虫,但是却需要爬取百万级数据,这时候想到了位操作符。

先来2个程序对比一下:

程序1:

 1 #coding:utf-8
 2
 3 import time
 4 import datetime
 5
 6 pagesNum = 0
 7
 8 def getLinks():
 9     global pagesNum
10     for i in range(0,0xfffffff):
11         pagesNum += 1
12         if pagesNum & 0xfff == 1:
13             pass
14
15
16 print(‘Begin:‘,datetime.datetime.now())
17
18 for i in range(10):
19    getLinks()
20 print(‘End:‘,datetime.datetime.now())
运行结果如下:

Begin: 2016-08-03 10:50:13.694231
End: 2016-08-03 10:58:46.796579

程序2:

 1 #coding:utf-8
 2 import time
 3 import datetime
 4
 5 pagesNum = 0
 6
 7 def getLinks():
 8     global pagesNum
 9     for i in range(0,0xfffffff):
10         pagesNum += 1
11         if pagesNum % 4095 == 1:
12             pass
13
14
15 print(‘Begin:‘,datetime.datetime.now())
16
17  for i in range(10):
18      getLinks()
19 print(‘End:‘,datetime.datetime.now())

运行结果:

Begin: 2016-08-03 09:42:40.624409
End: 2016-08-03 09:52:50.405286

事实证明,位运算比除法运算确实快不少。在循环中,从时间上进行直观分析,效率大概提升了12%。

Tips:

1.除法和乘法是最容易进行位运算的,%模运算也可以考虑替换为位运算。

每当乘以2的指数倍的时候,相当于<<指数位,即:num * (2^x) == num << x

每当除以2的指数倍的时候,相当于>>指数位,即:num * (2^x) == num >> x

2.程序,除了追求正确性和鲁棒性之外,就是效率!!!

时间: 2024-08-25 21:22:04

利用位操作符加速程序的运行的相关文章

如何利用 JConsole观察分析Java程序的运行,进行排错调优(转)

如何利用 JConsole观察分析Java程序的运行,进行排错调优 博客分类: JAVA JavaOracleSUNEclipseJDK 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码. 二.如何启动JConsole 如果是从命令行启

利用hadoop自带程序运行wordcount

1.启动hadoop守护进程 bin/hadoop start-all.sh 2.在hadoop的bin目录下建立一个input文件夹 mkdire input 3.进入input目录之后,在input目录下新建两个文本文件,并想其写入内容 echo "hello excuse me fuck thank you">test1.txt echo "hello how do you do thank you">test2.txt 4.进入hadoop的bi

.net利用程序集的GUID解决程序只能运行一次的问题

可以解决同名的程序集(但非同一程序集)只能运行一次的问题,网上很资料都是只检测程序是否同名,不能真正的保证是同一程序集. private bool prevInstance() { Process[] myProcesses= Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName); if (myProcesses.Length > 1) { GuidAttribute curGuid = (GuidAttribut

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行

利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码. 二.如何启动JConsole 如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole

如何在64位版本Linux上开发运行32位应用程序

最近换了Linux系统,由i686换成了x86-64,导致在进行开发的时候出用不了原来SDK中32位的开发工具.于是,博主找到如下文章,博主亲测实用: 如何在64位版本Linux上开发运行32位应用程序 内容如下: 很多程序员(特别是别的公司的)跟我抱怨说他们32位软件无法在我们的64位Linux系统上正常运行,而在他们32位机上正常,其实这个很好解决,一般 是64位系统安装后没有默认安装glibc的32位版本,通过简单的执行以下命令即可实现在64位Linux系统上开发运行32位应用程序,而不用

不允许用(a+b)/2这种方式求两个数的均值;如下程序在Linux和32位集成开发环境中运行

#define MAX(a,b) ((a)>(b)?(a):(b)) #include<stdio.h> int main() { int a = 10; int b = 20; int c = 0; int arevage = 0; c = MAX(a,b); arevage = c + (a - b)/2; printf("%d\n",arevage); return 0; } arevage可以用来定义变量吗 为什么 int arevage = 0;可以在win

Windows程序内部运行机制

Windows程序内部运行机制 一.        API与SDK Windows操作系统提供了各种各样的函数,以方便我们开发Windows应用程序,这些函数是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称为API函数.我们在编写Windows程序时所说的API函数,就是指系统提供的函数,所有主要的Windows函数都在Windows.h头文件中进行了说明. SDK的全称是Software Development Kit

利用预渲染加速iOS设备的图像显示

    最近在做一个UITableView的例子,发现滚动时的性能还不错.但来回滚动时,第一次显示的图像不如再次显示的图像流畅,出现前会有稍许的停顿感. 于是我猜想显示过的图像肯定是被缓存起来了,查了下文档后发现果然如此. 后来在<Improving Image Drawing Performance on iOS>一文中找到了一些提示:原来在显示图像时,解压和重采样会消耗很多CPU时间:而如果预先在一个bitmap context里画出图像,再缓存这个图像,就能省去这些繁重的工作了. 接着我

[VC]在VC++中实现让程序只运行一个实例的方法且实现该实例

方法一: 有时候在开发应用程序时,希望控制程序运行唯一的实例.例如,最常用的mp3播放软 件Winamp,由于它需要独占计算机中的音频设备,因此该程序只允许自身运行唯一的一个例程.在Visual C++的开发实践中,对于16位的Windows系统,应用程序的hPrevInstance句柄保存了应用程序上一个运行的实例,可以用该值来检查是否 有实例运行:然而在32位Windows系统下,这个值总是NULL,所以无法利用该值来实现程序运行唯一实例.本实例给出了解决这个问题的简单办法,只 要将程序中稍