Tag: 性能

为什么这个程序的multithreading版本更慢?

我正在尝试学习pthreads,我一直在试验一个试图检测数组上的变化的程序。 函数array_modifier()选择一个随机元素并切换它的值(1到0,反之亦然),然后hibernate一段时间(足够大,所以不会出现竞争条件,我知道这是不好的做法)。 change_detector()扫描数组,当元素与其先前值不匹配且等于1时,检测到更改并使用检测延迟更新diff数组。 当有一个change_detector()线程( NTHREADS==1 )时,它必须扫描整个数组。 当有更multithreading时,每个线程都分配了一部分数组。 每个探测器线程只捕获其数组部分的修改,因此您需要将所有4个线程的捕获时间相加,以获得捕获所有更改的总时间。 这是代码: #include #include #include #include #include #include #define TIME_INTERVAL 100 #define CHANGES 5000 #define UNUSED(x) ((void) x) typedef struct { unsigned int tid; } parm; static volatile unsigned int* my_array; static unsigned int* old_value; static struct timeval* time_array; static unsigned int N; static unsigned long int diff[NTHREADS] […]

将工作分成更multithreading需要更多时间,为什么?

我有一个小的C程序,它使用monte-carlo模拟计算pi ,它基本上只测试一个随机点[x,y],如果它在圆圈内部或外部。 为了近似pi,我必须使用大量的样本n ,其具有O(n)的直接比例复杂度。 因此,尝试计算大量样本n,我实现了POSIX线程 api以平衡计算能力。 我的代码如下所示: pthread_t worker[nthreads]; /* creates workers for each thread */ struct param aparam[nthreads]; /* struct param{ long* hits; long rounds; }; */ long nrounds = nsamples / nthreads; /* divide samples to subsets of equal rounds per thread */ for (int i = 0; i < nthreads; ++i) { […]

在c中对双向链表进行排序

我想在插入元素时按排序顺序保留链表(列表中大约200000个元素),您可以推荐哪种算法? 我使用插入排序做了一个简单的实现,但它的性能非常糟糕(很多CPU使用率)。 谢谢你的帮助。 我在合并排序和插入排序之间进行了一些比较,但似乎插入排序具有更好的性能,我对这个结果有点困惑。 你能告诉我什么是错的,是否有更好的算法? 我的代码(为简单起见,我省略了节点结构中的prev节点): struct node { int number; struct node *next; }; 插入排序: void insert_node(int value) { struct node *new_node = NULL; struct node *cur_node = NULL; struct node *last_node = NULL; int found; /* 1 means found a place to insert the new node in, 0 means not*/ new_node = (struct […]

编译成更快的代码:“n * 3”或“n +(n * 2)”?

编译成更快的代码:“ans = n * 3”或“ans = n +(n * 2)”? 假设n是int或long,它是在现代Win32 Intel盒子上运行的。 如果涉及一些解除引用,这会有所不同,也就是说,哪一个会更快? 长的; long * pn; 长的; … * pn = some_number; ans = * pn * 3; 要么 ans = * pn +(* pn * 2); 或者,它是否需要不用担心,因为优化编译器在任何情况下都可能解释这一点?

Java比C更快

今天我做了一个简单的测试来比较java和c之间的速度 – 一个简单的循环使整数“i”从0增加到20亿。 我真的希望c语言比java更快。 我对结果感到惊讶: java的时间以秒为单位:约 。 1.8秒 c:约需要几秒钟的时间 3.6秒 我不认为java是一种更快的语言,但我不明白为什么循环的速度是我简单程序中c的两倍? 我在节目中做了一个至关重要的错误吗? 或者是MinGW的编译器配置不当还是什么? public class Jrand { public static void main (String[] args) { long startTime = System.currentTimeMillis(); int i; for (i = 0; i < 2000000000; i++) { // Do nothing! } long endTime = System.currentTimeMillis(); float totalTime = (endTime – startTime); System.out.println("time: " […]

如何用kevent()替换select()以获得更高的性能?

来自Kqueue维基百科页面 : Kqueue在内核和用户空间之间提供高效的输入和输出事件管道。 因此,可以修改事件filter以及接收未决事件,同时每个主事件循环迭代仅使用对kevent(2)的单个系统调用。 这与较旧的传统轮询系统调用形成对比,例如poll(2)和select(2)效率较低,尤其是在对大量文件描述符上的事件进行轮询时 这听起来很不错。 我为我的服务器定位FreeBSD,我正在处理大量的网络套接字fd – 在它们上面使用select()并确定从哪里读取数据。 我宁愿使用kevent()调用来获得更高的性能,因为它就是它的用途! 我在这里阅读了关于FreeBSD的kevent的手册页,但它对我来说很神秘,我找不到解释它的好资源。 使用kevent替换select的一个例子可以解决我的问题,也可以帮助我更好地了解如何使用kevent()。

错误的gcc生成的assembly顺序,导致性能损失

我有以下代码,它将数据从内存复制到DMA缓冲区: for (; likely(l > 0); l-=128) { __m256i m0 = _mm256_load_si256( (__m256i*) (src) ); __m256i m1 = _mm256_load_si256( (__m256i*) (src+32) ); __m256i m2 = _mm256_load_si256( (__m256i*) (src+64) ); __m256i m3 = _mm256_load_si256( (__m256i*) (src+96) ); _mm256_stream_si256( (__m256i *) (dst), m0 ); _mm256_stream_si256( (__m256i *) (dst+32), m1 ); _mm256_stream_si256( (__m256i *) (dst+64), m2 ); _mm256_stream_si256( […]

浮点转换和性能

我知道在浮点数和整数之间进行转换时可能出现的错误,但性能如何(请忽略准确性问题)? 一般来说,如果我对不同算术类型的操作数进行n-ary操作,即不同的浮点类型(例如float和double )和浮点/整数类型组合(例如float和int ),性能是否会受到影响? 是否存在经验法则,例如,使所有操作数保持相同的类型? PS:我在问,因为我正在编写一个表达式模板库,想知道是否允许对包含不同算术类型值的向量进行二进制运算。

OPROFILE无法获得性能数据

我正在使用OPROFILE来收集一些性能数据。 但我陷入困境。 这是我的shell: ~ # rm -f /root/.oprofile/daemonrc ~ # opcontrol –setup –no-vmlinux ~ # opcontrol –init ~ # opcontrol –reset ~ # opcontrol –start ~ # opcontrol –status Daemon running: pid 14909 Separate options: none vmlinux file: none Image filter: none Call-graph depth: 0 ~ # opcontrol –shutdown Stopping profiling. Killing daemon. ~ # […]

Java比C快2倍(作为C ++的一个子集)

下面的代码是一种非常低效的乘法算法。 它被写成测试目的。 我相信我用不同的语言编写了相同的代码。 正下方是运行代码的结果。 OS: Windows 7 language: C (as a subset of C++) compiler: Visual C++ optimization option: /Ox /Oi /Ot /Oy /GL running time (seconds): 40 +/- 1 compiler: MinGW/gcc optimization option: -O3 march=native running time (seconds): 81 +/- 1 compiler: MinGW/g++ optimization option: -O3 march=native running time (seconds): 82 +/- 1 language: […]