我测试了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
我想它必须与缓存相关,但我无法从以下缓存不友好的情况中找到原因:
由于这两种情况的性能下降是由不友好的循环引起的,这些循环将分散的字节读入高速缓存,浪费了高速缓存行的其余空间.
这是我的代码:
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)
考虑到来自@ usr,@ ChrisW和@Leeor的建议,我更准确地重新测试了测试,下面的图表显示了结果.缓冲区大小从26KB到38KB,我每隔64B测试一次(26KB,26KB + …
我在笔记本电脑中使用Chrome浏览器和Windows 7操作系统,Windows上的Chrome提供了一个Device Mode
(快捷方式F12
),以便它可以模拟特定的移动设备,以便在Chrome标签页中显示和显示网页,如下所示.
但是,这Device Mode
仅限于单个Chrome标签,因此当您关闭标签并打开新标签时,新标签会正常显示并显示网页,而不是在Device Mode
.
所以我的问题是如何Device Mode
永久设置,当我在Chrome中打开新标签时,它Device Mode
默认运行.是否有任何方法或插件可以帮助我实现它?
我想尽可能快地对两块内存进行异或,我如何使用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) 我写了一个测试速度的程序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 …
一个简单的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 …
我想知道OPC(开放平台通信)和DDS(数据分发服务)之间的区别.
我对这两个框架的理解是:通过机器上的通信中间件来简化复杂的网络编程.它们中的两个都用于通过消息传递在物理上分离的机器上进行程序通信.它们采用客户端 - 服务器模型作为TCP/IP套接字进行通信,但它们可以以多种多方式交换数据.此外,DDS通常用于飞机和军舰等关键系统.
如果有任何误解,或者您知道它们之间存在一些差异,请告诉我.
当将一组按钮中的多个单击信号连接到带有参数的单个槽函数时,我遇到了信号槽问题。
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) I generate a call graph of a complex MATLAB system, and I want to know which functions are built-in and mark them.