小编foo*_*ool的帖子

为什么memcpy()的速度每4KB大幅下降?

我测试了memcpy()在i*4KB时注意速度急剧下降的速度.结果如下:Y轴是速度(MB /秒),X轴是缓冲区的大小memcpy(),从1KB增加到2MB.子图2和子图3详述了1KB-150KB和1KB-32KB的部分.

环境:

CPU:Intel(R)Xeon(R)CPU E5620 @ 2.40GHz

操作系统:2.6.35-22-通用#33-Ubuntu

GCC编译器标志:-O3 -msse4 -DINTEL_SSE4 -Wall -std = c99

每4k显示低谷的memcpy速度图

我想它必须与缓存相关,但我无法从以下缓存不友好的情况中找到原因:

由于这两种情况的性能下降是由不友好的循环引起的,这些循环将分散的字节读入高速缓存,浪费了高速缓存行的其余空间.

这是我的代码:

void memcpy_speed(unsigned long buf_size, unsigned long iters){
    struct timeval start,  end;
    unsigned char * pbuff_1;
    unsigned char * pbuff_2;

    pbuff_1 = malloc(buf_size);
    pbuff_2 = malloc(buf_size);

    gettimeofday(&start, NULL);
    for(int i = 0; i < iters; ++i){
        memcpy(pbuff_2, pbuff_1, buf_size);
    }   
    gettimeofday(&end, NULL);
    printf("%5.3f\n", ((buf_size*iters)/(1.024*1.024))/((end.tv_sec - \
    start.tv_sec)*1000*1000+(end.tv_usec - start.tv_usec)));
    free(pbuff_1);
    free(pbuff_2);
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

考虑到来自@ usr,@ ChrisW和@Leeor的建议,我更准确地重新测试了测试,下面的图表显示了结果.缓冲区大小从26KB到38KB,我每隔64B测试一次(26KB,26KB + …

memory malloc performance memcpy cpu-cache

57
推荐指数
1
解决办法
2万
查看次数

如何永久使用我的PC Chrome作为移动Chrome?

我在笔记本电脑中使用Chrome浏览器和Windows 7操作系统,Windows上的Chrome提供了一个Device Mode(快捷方式F12),以便它可以模拟特定的移动设备,以便在Chrome标签页中显示和显示网页,如下所示.

在此输入图像描述

但是,这Device Mode仅限于单个Chrome标签,因此当您关闭标签并打开新标签时,新标签会正常显示并显示网页,而不是在Device Mode.

所以我的问题是如何Device Mode永久设置,当我在Chrome中打开新标签时,它Device Mode默认运行.是否有任何方法或插件可以帮助我实现它?

google-chrome

9
推荐指数
1
解决办法
561
查看次数

如何使用SIMD加速XOR两块内存?

我想尽可能快地对两块内存进行异或,我如何使用SIMD来加速它?

我的原始代码如下:

void region_xor_w64(   unsigned char *r1,         /* Region 1 */
                       unsigned char *r2,         /* Region 2 */
                       int nbytes)       /* Number of bytes in region */
{
    uint64_t *l1;
    uint64_t *l2;
    uint64_t *ltop;
    unsigned char *ctop;

    ctop = r1 + nbytes;
    ltop = (uint64_t *) ctop;
    l1 = (uint64_t *) r1;
    l2 = (uint64_t *) r2;

    while (l1 < ltop) {
        *l2 = ((*l1)  ^ (*l2));
        l1++;
        l2++;
    }
}
Run Code Online (Sandbox Code Playgroud)

我自己写了一个,但速度很快.

void region_xor_sse(   unsigned char* dst,
                       unsigned char* src, …
Run Code Online (Sandbox Code Playgroud)

c simd xor

6
推荐指数
1
解决办法
2838
查看次数

memcpy()的速度受malloc()的不同方式的影响很大

我写了一个测试速度的程序memcpy().但是,如何分配内存会极大地影响速度.

#include<stdlib.h>
#include<stdio.h>
#include<sys/time.h>

void main(int argc, char *argv[]){
    unsigned char * pbuff_1;
    unsigned char * pbuff_2;
    unsigned long iters = 1000*1000;

    int type = atoi(argv[1]);
    int buff_size = atoi(argv[2])*1024;

    if(type == 1){ 
        pbuff_1 = (void *)malloc(2*buff_size);
        pbuff_2 = pbuff_1+buff_size;
    }else{
        pbuff_1 = (void *)malloc(buff_size);
        pbuff_2 = (void *)malloc(buff_size);
    }   

    for(int i = 0; i < iters; ++i){
        memcpy(pbuff_2, pbuff_1, buff_size);
    }   

    if(type == 1){ 
        free(pbuff_1);
    }else{
        free(pbuff_1);
        free(pbuff_2);
    }   
}
Run Code Online (Sandbox Code Playgroud)

操作系统是linux-2.6.35,编译器是GCC-4.4.5,选项"-std = c99 -O3".

在我的计算机上的结果(memcpy …

malloc performance gcc memcpy cpu-cache

6
推荐指数
1
解决办法
1224
查看次数

一个C++类函数

一个简单的c ++文件和TT类有两种方法.

#include <map>
#include <string>
#include <iostream>

using namespace std;

class TT{ 
    public:
        TT(const string& str);
        template<class T>T Read(const string& key)const;
        template<class T>T Read(const string& key, const T& value)const;
};

TT::TT(const string& str){
    cout<<str<<endl;
}

template<class T>T TT::Read(const string& key)const{
    std::cout<<key<<std::endl;
    return 1;
}

template<class T>T TT::Read(const string& key, const T& value)const{
    std::cout<<key<<'\t'<<value<<std::endl;
    return value;
}

int main(void){
    TT tt("First");

    tt.Read("Hello", 12);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

如果更换

tt.Read("Hello world!", 12);
Run Code Online (Sandbox Code Playgroud)

tt.Read("Hello world!");
Run Code Online (Sandbox Code Playgroud)

主()

G ++说:

new.cc:31:错误:没有匹配函数来调用'TT :: Read(const …

c++ class

3
推荐指数
1
解决办法
246
查看次数

OPC和DDS之间的区别?

我想知道OPC(开放平台通信)和DDS(数据分发服务)之间的区别.

我对这两个框架的理解是:通过机器上的通信中间件来简化复杂的网络编程.它们中的两个都用于通过消息传递在物理上分离的机器上进行程序通信.它们采用客户端 - 服务器模型作为TCP/IP套接字进行通信,但它们可以以多种多方式交换数据.此外,DDS通常用于飞机和军舰等关键系统.

如果有任何误解,或者您知道它们之间存在一些差异,请告诉我.

ipc communication opc data-distribution-service

3
推荐指数
1
解决办法
2050
查看次数

PyQt/PySide中连接点击信号时lambda和partial的区别

当将一组按钮中的多个单击信号连接到带有参数的单个槽函数时,我遇到了信号槽问题。

lambda可以functools.partial按如下方式使用:

user = "user"
button.clicked.connect(lambda: calluser(name))

from functools import partial
user = "user"
button.clicked.connect(partial(calluser, name))
Run Code Online (Sandbox Code Playgroud)

虽然在某些情况下,它们的表现有所不同。以下代码显示了一个示例,该示例期望在单击每个按钮时打印每个按钮的文本。但使用该方法时输出始终是“按钮3” lambda。该partial方法符合我们的预期。

我怎样才能找到他们的差异?

from PyQt5 import QtWidgets

class Program(QtWidgets.QWidget):
    def __init__(self):
        super(Program, self).__init__()
        self.button_1 = QtWidgets.QPushButton('button 1', self)
        self.button_2 = QtWidgets.QPushButton('button 2', self)
        self.button_3 = QtWidgets.QPushButton('button 3', self)
        from functools import partial
        for n in range(3):
            bh = eval("self.button_{}".format(n+1)) 
            # lambda method : always print `button 3`
            # bh.clicked.connect(lambda: self.printtext(n+1))
            bh.clicked.connect(partial(self.printtext, n+1))
        
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.button_1)
        layout.addWidget(self.button_2)
        layout.addWidget(self.button_3) …
Run Code Online (Sandbox Code Playgroud)

python lambda partial signals-slots pyqt5

3
推荐指数
1
解决办法
2076
查看次数

How to tell if a function is built-in or self-defined by its name?

I generate a call graph of a complex MATLAB system, and I want to know which functions are built-in and mark them.

matlab function built-in call-graph function-declaration

1
推荐指数
1
解决办法
60
查看次数