小编Rob*_*nes的帖子

访问单个结构成员是否将整个结构体拉入缓存?

我一直在阅读Ulrich Drepper的文章," 每个程序员应该知道的关于内存的内容 "和第3.3.2"缓存效果的测量"(页面中间),它给我的印象是访问结构的任何成员会导致整个结构被拉入CPU缓存.

它是否正确?如果是这样,硬件如何知道这些结构的布局?或者编译器生成的代码是否以某种方式强制加载整个结构?

或者使用较大结构的速度是否主要是由于结构体分布在更多内存页面引起的TLB未命中?

Drepper使用的示例结构是:

  struct l {
    struct l *n;
    long int pad[NPAD];
  };
Run Code Online (Sandbox Code Playgroud)

其中sizeof(l)NPAD等于0,7,15或31 确定,导致相隔0,56,120和248字节的结构,并假设高速缓存行为64字节和4k页.

随着结构的增长,迭代遍历链表会变得非常慢,即使实际上没有其他指针被访问.

c linux memory caching

7
推荐指数
2
解决办法
982
查看次数

如何让Perl的调试器和gVim在Linux上协同工作?

有没有办法让Perl的调试器和gVim在Linux上协同工作?即在gVim中逐步执行代码并查看从gVim中控制调试器的监视变量的值?

debugging vim perl

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

TCP,HTTP和多线程甜点

我试图了解我得到的性能数字以及如何确定最佳线程数.

有关我的结果,请参阅本文的底部

我在perl中编写了一个实验性多线程Web客户端,用于下载页面,抓取每个图像标记的源并下载图像 - 丢弃数据.

它使用非阻塞连接,每个文件的初始超时为10秒,每次超时后重复一次并重试.它还缓存IP地址,因此每个线程只需执行一次DNS查询.

通过http://hubblesite.org/gallery/album/entire/npp/all/hires/true/的 2.5Mbit连接,1316个文件中下载的数据总量为2271122个字节.缩略图由一家公司托管,该公司声称专门为高带宽应用提供低延迟.

挂壁时间是:

1线程需要4:48 - 0超时
2线程需要2:38 - 0超时
5线程需要2:22 - 20次超时
10线程需要2:27 - 40次超时
50线程需要2:27 - 170次超​​时

在最坏的情况下(50个线程),客户端消耗的CPU时间少于2秒.

平均文件大小1.7k
avg rtt 100 ms(通过ping测量)
avg cli cpu/img 1 ms

最快的平均下载速度是5个线程,总体上大约15 KB /秒.

服务器实际上确实具有相当低的延迟,因为每个映像只需要218毫秒,这意味着服务器平均只需要18毫秒来处理每个请求:

0 cli发送syn
50 srv rcvs syn
50 srv发送syn + ack
100 cli conn建立/ cli发送获取
150 srv recv获取
168 srv读取文件,发送数据,调用关闭
218 cli recv HTTP头文件+ 2个段中的完整文件MSS == 1448

我可以看到每个文件的平均下载速度很低,因为文件很小,连接设置的每个文件的成本相对较高.

我不明白的是为什么我看到超过2个线程的性能几乎没有改善.服务器似乎足够快,但已经开始超时连接5个线程.

超时似乎是在大约900到1000个成功连接之后开始的,无论它是5个还是50个线程,我认为这可能是服务器上的某种限制阈值,但我预计10个线程仍然会比2快得多.

我在这里错过了什么吗?

编辑-1

为了比较,我安装了DownThemAll Firefox扩展并使用它下载了图像.我将它设置为4个同时连接,10秒超时.DTM花了大约3分钟来下载所有文件并将它们写入磁盘,并且在大约900个连接之后它也开始经历超时.

我将运行tcpdump来尝试更好地了解tcp协议级别的情况.

我还清除了Firefox的缓存并重新加载.40秒重新加载页面和所有图像.这似乎太快了 - 也许Firefox将它们保存在一个未清除的内存缓存中?所以我打开了Opera,它也花了大约40秒.我认为他们的速度要快得多,因为他们必须使用HTTP/1.1流水线技术?

而答案是!??

因此,经过一些测试和编写代码以通过流水线重用套接字后,我发现了一些有趣的信息.

当以5个线程运行时,非流水线版本在77秒内检索前1026个图像,但还需要65秒来检索剩余的290个图像.这几乎证实了 …

perl multithreading network-programming tcp http

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

gnu make:如何连接两个字符串

鉴于这条线:

program_OBJS := ${program_SRCS:.cpp=.o}
Run Code Online (Sandbox Code Playgroud)

我想附加.o到每个文件名而不是替换.cpp.o.

我怎么做?

gnu makefile gnu-make

6
推荐指数
4
解决办法
3万
查看次数

我可以使用Intellij Idea为Greenfoot开发吗?

我正在学习Java课程,我必须为Greenfoot做一些开发.我已经习惯于在C/C++中使用vim进行开发,所以一直在使用带有vim插件的Intellij Idea.

我鄙视Greenfoot IDE.

是否可以使用Intellij为Greenfoot开发?

java windows intellij-idea greenfoot

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

如何直接从Linux内核GIT存储库中扩展文件?

我希望能够直接从Linux Kernel GIT存储库中分配文件/目录,而无需下载完整的源代码.

具体来说,我对两个可能的解决方案感兴趣:

  1. 通过网络浏览器(firefox)进行差异的能力
  2. Ubuntu的GUI实用程序,可以执行远程差异.
  3. 如何设置选项#2的教程

编辑

作为我正在寻找的一个例子,我曾经在CVS回购中使用CrossVC来完成上述任务.

git diff linux-kernel

5
推荐指数
2
解决办法
6633
查看次数

Judy树的示例用法

我正在读关于朱迪树的事.有哪些实际使用示例和与其他数据结构的比较?

data-structures

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

Perl的inet_aton线程安全吗?

inet_aton线程安全的?我根据这UNP POSIX并不需要很多的套接字API的线程安全的认识,所以我必须承担他们没有,但一般我怎么知道,如果事情是线程在Perl安全吗?我需要在何种程度上锁定我调用的库函数?我该如何锁定它们?当我尝试类似的东西lock(&inet_aton)时会给我一个错误: Can't modify non-lvalue subroutine call in lock.

是的,我读过:系统库的线程安全性

perl multithreading

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

wireshark和tcpdump -r:奇怪的tcp窗口大小

我正在使用tcpdump捕获http流量,并且对TCP慢启动和窗口大小增加感兴趣:

$ sudo tcpdump -i eth1 -w wget++.tcpdump tcp and port 80
Run Code Online (Sandbox Code Playgroud)

当我使用Wireshark查看转储文件时,窗口大小的进展看起来正常,即5840,5888,5888,8576,11264等...

但是当我查看转储文件时

$ tcpdump -r wget++.tcpdump -tnN | less
Run Code Online (Sandbox Code Playgroud)

我得到了似乎毫无意义的窗口大小(为简洁省略了IP地址):

: S 1069713761:1069713761(0) win 5840 <mss 1460,sackOK,timestamp 24220583 0,nop,wscale 7>
: S 1198053215:1198053215(0) ack 1069713762 win 5672 <mss 1430,sackOK,timestamp 2485833728 24220583,nop,wscale 6>
: . ack 1 win 46 <nop,nop,timestamp 24220604 2485833728>
: . 1:1419(1418) ack 1 win 46 <nop,nop,timestamp 24220604 2485833728>
: P 1419:2002(583) ack 1 win 46 <nop,nop,timestamp 24220604 2485833728>
: . ack 1419 win 133 <nop,nop,timestamp …
Run Code Online (Sandbox Code Playgroud)

linux tcp tcpdump wireshark

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

将链表拆分为2个包含最小和最大数字的偶数列表

给定一个按随机顺序排列的整数列表,将其拆分为两个新的链表,这样每个列表元素总和的差异最大,列表长度相差不超过1(在原始情况下) list有奇数个元素). 我不能假设列表中的数字是唯一的.

我想到的算法是在原始链表(O(n·log n)时间,O(n)空间)上进行合并排序,然后使用递归函数走到列表末尾以确定其长度,在递归函数展开时进行拆分.递归函数是O(n)时间和O(n)空间.

这是最佳解决方案吗?如果有人认为它是相关的,我可以发布我的代码.

java algorithm data-structures

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