Tag: 性能

快速向后转动大块内存

我需要以相反的顺序重写大约4KB的数据,在位级(最后一个字节的最后一位成为第一个字节的第一位),尽可能快。 有没有聪明的小册子呢? 理由:数据是嵌入式设备中LCD屏幕的显示内容,通常以屏幕位于肩膀上的方式定位。 屏幕有“6点钟”的方向,可以从下面看 – 像平躺或挂在眼睛上方。 这可以通过将屏幕旋转180度来固定,但是我需要从屏幕的左上角开始反转屏幕数据(由库生成),即1位= 1像素。 CPUfunction不是很强大,设备已经有足够的工作量,加上一秒钟的几帧,所以性能是个问题; RAM不是那么多。 编辑:单核,ARM 9系列。 64MB,(缩小到32MB以后),Linux。 数据通过8位IO端口从系统存储器推送到LCD驱动器。 CPU为32位,在字长方面的性能要比字节级高得多。

为什么++我可能与i + = 1表现不同

显然是在阅读了旧标题之后 为什么像is ++i fster than i+=1这样的问题甚至存在 人们没有仔细阅读这个问题本身。 问题不在于人们提出要求的理由! 这就是为什么编译器会在++i和i+=1之间产生差异,并且有任何可能出现的情况都是有意义的。 虽然我很欣赏你所有的诙谐和深刻的评论,但我的问题并非如此。 好吧,好吧,让我试着用另一种方式提出问题,我希望我的英语足够好,这次我可以表达自己而不会被误解,所以请阅读 。 让我们说有人在一本10年前的书中读到这个: 使用++ i over i = i + 1可以获得性能优势。 我并不热衷于这个特定的例子,而是更多或更少地谈论。 显然,当作者写这本书时,对他来说是有道理的,他不仅仅是弥补了这一点。 我们知道现代编译器不关心你是使用++i , i+=1还是i = i + 1 ,代码将被优化并且我们将具有相同的asm输出。 这似乎很合乎逻辑:如果两个操作做同样的事情并且具有相同的结果,则没有理由将++i编译成一个东西,并且i+=1变成另一个东西。 但是自从这本书作者写下来之后 ,他已经看到了它的不同之处! 这意味着某些编译器实际上会为这两行产生不同的输出。 这意味着制作编译器的人有一些理由以不同的方式处理++i和i+=1 。 我的问题是他们为什么会这样做? 是不是因为那些日子很难/不可能使编译器足够先进以进行这样的优化? 或者也许在一些非常具体的平台/硬件上/在某些特殊情况下,实际上有必要在++i和i+=1以及其他类似东西之间做出改变? 或者它可能取决于变量类型? 或者编译器开发者只是懒惰?

用C语言快速读取文件

嗯,我想知道是否比使用fscanf()更快地读取文件的方法 例如,假设我有这个文本 4 55 k 52 o 24 l 523 i 首先,我想读取第一个数字,它给出了以下行数。 将这个数字称为N. 在N之后,我想要读取具有整数和字符的N行。 使用fscanf会是这样的 fscanf(fin,”%d %c”,&a,&c);

C:结构或数组的速度更快?

我想实现(抽象地表示)二维4×4矩阵。 我为矩阵乘法等编写的所有代码都将完全“展开” – 也就是说,我不会使用循环来访问和写入矩阵中的数据条目。 我的问题是:在C中,使用结构本身会更快: typedef struct { double e0, e1, e2, e3, e4, …, e15 } My4x4Matrix; 或者这会更快: typedef double My4x4Matrix[16]; 鉴于我将单独访问每个矩阵元素: My4x4Matrix a,b,c; // (Some initialization of a and b.) … c.e0=a.e0+b.e0; c.e1=a.e1+b.e1; … 要么 My4x4Matrix a,b,c; // (Some initialization of a and b.) … c[0]=a[0]+b[0]; c[1]=a[1]+b[1]; … 或者它们的速度完全相同?

其他function/方法定义会增加程序的内存占用吗?

在C ++中,定义未使用的其他方法或函数是否会导致更大的内存占用或更慢的执行速度? 基本上,我在类中有几个实用程序调试方法,这些方法都不是正常使用类所必需的。 如果它们从未被使用过,这些定义是否仍然存在,它会在内存占用或速度方面产生影响吗? 例如: class myClass { public: //Something the user of this class would use int doSomething() {…} //Something used solely to make sure I wrote the class properly bool isClassValid() {…} }; … myClass classInstance(); myClass.doSomething();

O(1)随机插入/删除和O(1)随机访问的数据结构是什么?

我不知道用于此问题的数据结构。 我希望结构具有: 恒定时间插入或删除。 通过id进行恒定时间检索。 实际系统是: 我有一堆对象,每个对象都有一个唯一的id。 我的程序需要接收id的请求并返回相关对象。 每当它收到我想要的请求时:搜索结构以查看它是否在那里。 如果是,请退货。 如果不是,请将其从磁盘加载到内存中(将其放入结构中,以便下次请求时不必使用磁盘)然后将其返回。 我正在使用C. 这是一个类似的问题,但我不确定它有多相关。

寻找最快的汉明距离C实现

我想找到两个等长的字符串有多少个不同的字符。 我发现xoring算法被认为是最快的,但它们返回以位表示的距离。 我希望结果以字符表示。 假设“pet”和“pit”的距离1以字符表示,但“e”和“i”可能有两个不同的位,因此xoring返回2。 我写的函数是: // na = length of both strings unsigned int HammingDistance(const char* a, unsigned int na, const char* b) { unsigned int num_mismatches = 0; while (na) { if (*a != *b) ++num_mismatches; –na; ++a; ++b; } return num_mismatches; } 会变得更快吗? 也许使用一些较低级别的命令或实现不同的算法? 系统:Intel Xeon X5650上的Gcc 4.7.2 谢谢

do“const”声明有助于编译器(GCC)生成更快的代码吗?

const声明有助于编译器(GCC)生成更快的代码,还是只对可读性和正确性有用? Zed Shaw认为const在C / C ++中没用或过度使用: 接下来是对const的所有奇怪的魅力。 由于一些奇怪的原因,C ++喜欢让你在声明的每个部分都使用const,但是我得到与C相同的最终结果:调用一个函数。 (……) (来自: http : //librelist.com/browser//mongrel2/2010/7/15/c-verses-c++/#770d94bcfc6ddf1d8510199996b607dd )

读入大文件并制作字典

我有一个大文件,我需要阅读并从中制作字典。 我希望这个尽可能快。 但是我在python中的代码太慢了。 这是一个显示问题的最小示例。 首先制作一些假数据 paste <(seq 20000000) largefile.txt 现在这里有一段最小的python代码来读取它并制作一本字典。 import sys from collections import defaultdict fin = open(sys.argv[1]) dict = defaultdict(list) for line in fin: parts = line.split() dict[parts[0]].append(parts[1]) 时序: time ./read.py largefile.txt real 0m55.746s 但是它不是I / O绑定的: time cut -f1 largefile.txt > /dev/null real 0m1.702s 如果我注释掉dict行,则需要9秒。 似乎几乎所有的时间都花在了dict[parts[0]].append(parts[1]) 。 有什么方法可以加快速度吗? 我不介意使用cython甚至C,如果这会产生很大的不同。 或者pandas可以在这帮忙吗? 以下是大小为10000000行的文件的配置文件输出。 python […]

难以衡量C / C ++性能

我写了一段C代码,以展示关于优化和分支预测的讨论中的一点。 然后我注意到比我预期的更多样化的结果。 我的目标是用C ++和C之间通用子集的语言编写它,这对于两种语言都是标准兼容的并且相当便携。 它在不同的Windows PC上进行了测试: #include #include /// @return – time difference between start and stop in milliseconds int ms_elapsed( clock_t start, clock_t stop ) { return (int)( 1000.0 * ( stop – start ) / CLOCKS_PER_SEC ); } int const Billion = 1000000000; /// & with numbers up to Billion gives 0, 0, […]