Tag: 性能

以最有效的方式逐行读取*平台特定*

我正在寻找一种最有效的方式来阅读文本文件。 考虑到每一个可能的优点,例如: 代码将是特定于平台的Windows操作系统 以及我正在编写一个特定的当前CPU等事实’.. *不介意它不是多平台。 只是简单的性能问题 我怎么能以最快的方式编码,将文本文件的每一行读入结构? 说结构是: typdef struct _FileL{ uint lidx; char* lncontent; } FileL; 我想的是: 传递上面的FileL动态数组和文件路径,这将是填充和返回给定文件的行集合的最有效方法? getFileLines(char* fullPath, FileL** fileLines){ uint linesCount = 0;// total lines uint curLnIndex = 0;// lines counter FILE* srcFL; // will hold the source file using passed fullPath // now read file into memory //that is the […]

x + = 1比x = x + 1更有效吗?

在x = x + 1 , x评估两次? 如果是这样,这是指x += 1 , x只评估一次? 两个表达式如何根据编译器中间代码进行评估? 例如, x++可能意味着:获取x的位置,将x的内容加载到寄存器中,并在内存中增加x的值。 另外我已经读过,当x不是一个简单的变量,而是一个涉及数组的表达式时, x += 1很有用。 任何想法为什么会这样?

将32 0/1值打包到单个32位变量的位中的最快方法是什么?

我正在使用x86或x86_64机器。 我有一个数组unsigned int a[32]所有元素的值都是0或1.我想设置单个变量unsigned int b这样(b >> i) & 1 == a[i]将保持为a的所有32个元素。 我正在使用Linux上的GCC(我猜不应该这么做)。 在C中执行此操作的最快方法是什么?

获得对齐内存的最佳跨平台方法

这是我通常使用的代码,用于获取与Visual Studio和GCC对齐的内存 inline void* aligned_malloc(size_t size, size_t align) { void *result; #ifdef _MSC_VER result = _aligned_malloc(size, align); #else if(posix_memalign(&result, align, size)) result = 0; #endif return result; } inline void aligned_free(void *ptr) { #ifdef _MSC_VER _aligned_free(ptr); #else free(ptr); #endif } 这个代码一般都没问题吗? 我也看到人们使用_mm_malloc , _mm_free 。 在大多数情况下,我想要对齐内存,使用SSE / AVX。 我可以一般使用这些function吗? 它会使我的代码更简单。 最后,创建我自己的函数来对齐内存很容易(见下文)。 那么为什么有这么多不同的常用函数来获得对齐的内存(其中许多只能在一个平台上运行)? 此代码执行16字节对齐。 float* array […]

如何加快浮点到整数转换?

我们在项目中进行了大量的浮点数到整数转换。 基本上,这样的事情 for(int i = 0; i < HUGE_NUMBER; i++) int_array[i] = float_array[i]; 执行转换的默认C函数非常耗时。 是否有任何工作(可能是手动调整function)可以加快一点点的过程? 我们不太关心精度。

哪个更快/更首选:memset或for循环将双精度数组归零?

double d[10]; int length = 10; memset(d, length * sizeof(double), 0); //or for (int i = length; i–;) d[i] = 0.0;

C中最快的文件读取

现在我正在使用fread()来读取文件,但在其他语言中,fread()效率很低,我被告知。 这在C中是一样的吗? 如果是这样,如何更快地完成文件读取?

格雷码递增函数

在不使用任何外部计数器或其他状态的情况下,我正在寻找一个有效的函数,该函数采用n位值(32位或左右)并返回格雷码中的后续值。 那是: int fn(int x) { int y = gray_to_binary(x); y = y + 1; return binary_to_gray(y); } 但是虽然binary_to_gray()函数是微不足道的( x ^ (x >> 1) ),但相应的gray_to_binary()根本不是那么简单( log(n)迭代的循环)。 也许有一个更有效的操作序列? 对于标准reflection格雷码,或者为了解决此问题而选择的另一格雷码。 旁白:我看到这个问题有两种可能的解决方案类型 – 一种是选择一种更容易转换为二进制的代码并使用上面给出的forms(或者为了反映代码演示更有效的二进制转换),以及另一种方法是将转换推迟到二进制并生成一种方法,该方法在不使用二进制增量的情况下遍历格雷码。 在后一种情况下,将结果代码转换为二进制代码可能会变得特别困难。 从实际角度来看,这可能是一个不利因素,但它仍然是一件有趣的事情。 更新:因为有人指出灰色解码只是log(n)操作(使用两种不同技术中的任何一种),我花了一些时间试图弄清楚这是否是对事物可以简化的严格限制。 在确定要执行的下一个操作时必须考虑所有位,否则“考虑”位将无法改变,并且函数将在两个值之间振荡。 必须以某种方式将输入压缩为可管理的比例,以确定要执行的下一个操作。 为了使其成为log(nk)操作,可以使用2k -entry LUT来缩短最后的k操作(注释表明k=32 )。 另一种可以经常减少事物的技术是乘法和位掩码的组合。 例如,计算奇偶校验以实现基于奇偶校验的算法。 从乘法和位掩码的方法来看,似乎可能有空间来发明格雷码,这进一步简化了操作集……但我不认为任何这样的代码是已知的。

快速检查字符数组是否为零的方法

我在内存中有一个字节数组。 查看数组中所有字节是否为零的最快方法是什么?

系统上的缓存大小估算?

我从这个链接( https://gist.github.com/jiewmeng/3787223)获得了这个程序。我一直在网上搜索,以便更好地理解处理器缓存(L1和L2)。我想成为能够编写一个程序,让我能够猜测我的新笔记本电脑上L1和L2缓存的大小。(仅用于学习目的。我知道我可以查看规格。) #include #include #include #define KB 1024 #define MB 1024 * 1024 int main() { unsigned int steps = 256 * 1024 * 1024; static int arr[4 * 1024 * 1024]; int lengthMod; unsigned int i; double timeTaken; clock_t start; int sizes[] = { 1 * KB, 4 * KB, 8 * KB, 16 […]