Tag: 性能

fwrite和写入大小的性能

我正在写一个大型数字二维数组到二进制文件(最终大小~75 MB)。 我在linux系统上这样做。 首先,有没有比fwrite更好的方法或系统调用来尽可能快地写入文件? 第二,如果我应该使用fwrite,那么我应该把整个文件写成1个连续的行吗? fwrite( buf, sizeof(float), 6700*6700, fp ); 或者把它写成一系列的块 fwrite( buf, sizeof(float), 8192, fp ); fwrite( *(buf+8192), sizeof(float), 8192, fp ); …. 如果我应该写下这些文字,那么每个文章应该有多大?

为什么树矢量化使这种排序算法慢2倍?

如果在gcc(4.7.2)中启用-fprofile-arcs则此问题的排序算法会快两倍(!)。 该问题的大量简化的C代码(事实certificate我可以用全零来初始化数组,奇怪的性能行为仍然存在,但它使得推理更加简单): #include #include #define ELEMENTS 100000 int main() { int a[ELEMENTS] = { 0 }; clock_t start = clock(); for (int i = 0; i < ELEMENTS; ++i) { int lowerElementIndex = i; for (int j = i+1; j < ELEMENTS; ++j) { if (a[j] < a[lowerElementIndex]) { lowerElementIndex = j; } } int […]

轻量级C ++图像库

我一直在寻找一个简单而小巧但又强大且快速( 不全面!)的C ++图像库(如果没有C ++版本,C就足够了)。 我正在寻找的主要function是: 免费(开源是一个加号) 专为速度而设计 没有巨大的function膨胀(像ImageMagik ,这是真正全面但是是猛犸象) 微小的内存占用 仅支持绝对最小的function,如加载/保存,resize,格式之间的转换。 没有什么花哨 “损坏”文件的错误恢复(与stb_image.c不同,后者的错误恢复非常差) MSVC和gcc友好(我使用CxImage多年,但最新版本我遇到了MSVC 2010的问题,看起来它的积极开发和支持已经消失了,所以我即将放弃它) 应该支持流行的现代格式,如JPEG2000,直接或通过使用像libpng这样的通用库 不关心它是DirectX还是OpenGL,因为我不打算用它来显示图像 – 只是为网站进行文件处理 支持静态和动态链接是一个优点 线程支持是一个巨大的优势 由于某种原因,我查看和解雇的图书馆: CxImage(不再有活跃的开发) ImageMagik – 太大(而且很慢) stb_image.c – error handling错误,不支持足够的图像格式 DevIL(还没有被解雇,但也没有看过很多 – 只是在几分钟之前在SO上的类似post中了解到它) – 基于它的大小和function设置它看起来非常有希望我需要的东西 FreeImage(和DevIL一样 – 很快就会看一下它,但它的尺寸有点大我的口味) SOIL(与stb_image.c相同) TimThumb – 它是一个PHP,而不是一个C / C ++ 简而言之,我只是希望尽可能小的东西尽可能快地牺牲仅仅具有绝对最小的function但我到目前为止还没找到合适的候选者。 请问这个社区有什么建议吗? 但请记住我上面列出的限制 – 我不认为抛出表格的答案“你试过X吗?” “X”不符合我需要的一半:) 编辑 :进一步了解DevIL似乎可能是我需要的东西。 它轻巧,小巧,坚固耐用。 现在我只需要确保它执行。 […]

-fno-strict-aliasing的性能影响

是否有任何研究或一组基准测试显示由于在GCC中指定-fno-strict-aliasing(或其他编译器中的等效项)而导致的性能下降?

找出最少3个数字的最快方法?

在我写的一个程序中,在这个例程中,20%的时间用于在内循环中找出最少3个数字: static inline unsigned int min(unsigned int a, unsigned int b, unsigned int c) { unsigned int m = a; if (m > b) m = b; if (m > c) m = c; return m; } 有什么方法可以加快速度吗? 对于x86 / x86_64,我也可以使用汇编代码。 编辑:回复一些评论: *正在使用的编译器是gcc 4.3.3 *就集会而言,我只是初学者。 我在这里要求组装,学习如何做到这一点。 🙂 *我运行四核Intel 64,因此支持MMX / SSE等。 *这里很难发布循环,但我可以告诉你它是levenshtein算法的一个高度优化的实现。 这是编译器给我的非内联版本的min: .globl min […]

什么是更好的使用,__try / __除块或try / catch块?

我想知道哪种方法可以捕获我抛出的exception:它是__try / __except块还是try / catch块? 我用C ++编写,程序只能在Windows上使用,因此可移植性不是问题。 谢谢!

Optimal Base-10只有itoa()函数?

在20多年的C语言编程中,我曾经使用过10次以外的基数,所以当我在另一个环境中发现我信任的MSVC的_itoa()时,我开始写一个只有10的基数,然后放入目标缓冲区参数,指向函数返回的存储,在左侧,而不是在右侧,与C标准库中的所有字符串函数一样。 我相信这段代码也是线程安全的。 有更快的方法吗? 我还要询问正确性,但我相信包含的测试代码certificate它有效,即使对于LONG_MIN的特定情况,即(-1 * LONG_MAX)-1,这导致代码失败,直到我改变了策略,注意标志,然后将signed int复制到unsigned int。 然后,我在函数中完成了无符号整数的所有核心工作 – 在75%的情况下,它也很愉快地运行。 char * _i32toa(char *const rtn, int32_t i) { if (NULL == rtn) return NULL; // declare local buffer, and write to it back-to-front char buff[12]; uint32_t ut, ui; char minus_sign=0; char *p = buff + sizeof(buff)-1; *p– = 0; // nul-terminate buffer // deal […]

是否有理由不使用链接时优化(LTO)?

GCC,MSVC,LLVM以及可能的其他工具链支持链接时(整个程序)优化,以允许编译单元之间的调用优化。 编译生产软件时是否有理由不启用此选项?

为什么glibc的sscanf比Linux上的fscanf慢得多?

我在x86_64 Linux上使用GCC 4.8和glibc 2.19。 在针对不同的问题使用不同的输入法时,我比较了fscanf和sscanf 。 具体来说,我会直接在标准输入上使用fscanf : char s[128]; int n; while (fscanf(stdin, “%127s %d”, s, &n) == 2) { } 或者我首先将整个输入读入缓冲区,然后使用sscanf遍历缓冲区。 (将所有内容读入缓冲区需要花费很少的时间。) char s[128]; int n; char const * p = my_data; for (int b; sscanf(p, “%127s %d%n”, s, &n, &b) == 2; p += b) { } 令我惊讶的是, fscanf版本的速度要快得多。 例如,使用fscanf处理数万行需要这么长时间: 10000 0.003927487 […]

数组结构和结构数组 – 性能差异

我有一个这样的课: //Array of Structures class Unit { public: float v; float u; //And similarly many other variables of float type, upto 10-12 of them. void update() { v+=u; v=v*i*t; //And many other equations } }; 我创建了一个Unit类型的对象数组。 并调用它们的更新。 int NUM_UNITS = 10000; void ProcessUpdate() { Unit *units = new Unit[NUM_UNITS]; for(int i = 0; i < […]