小编Art*_*ius的帖子

执行存储在数据段中的x86指令会导致性能下降?

我有一个简单的程序,首先将一些本机x86指令写入声明的缓冲区,然后设置一个指向此缓冲区的函数指针并进行调用.但是,当在堆栈上分配缓冲区时(而不是在堆上,甚至在全局数据区中),我注意到严重的性能损失.我验证了数据缓冲区中指令序列的开始是在一个16字节的边界上(我假设这是cpu需要(或想要)的内容).我不知道为什么它会在我执行指令的过程中产生影响,但在下面的程序中,"GOOD"在我的双核工作站上执行4秒钟,而"BAD"需要6分钟左右.是否存在某种对齐/ i-cache /预测问题?我对VTune的评估许可刚刚结束,所以我甚至无法对此进行分析:(.谢谢.


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef int (*funcPtrType)(int, int);

int foo(int a, int b) { return a + b; }

void main()
{
  // Instructions in buf are identical to what the compiler generated for "foo".
  char buf[201] = {0x55,
                   0x8b, 0xec,
                   0x8b, 0x45, 0x08,
                   0x03, 0x45, 0x0c,
                   0x5D,
                   0xc3
                  };

  int i;

  funcPtrType ptr;

#ifdef GOOD
  char* heapBuf = (char*)malloc(200);
  printf("Addr of heap buf: %x\n", &heapBuf[0]);
  memcpy(heapBuf, buf, 200);
  ptr = (funcPtrType)(&heapBuf[0]);
#else // BAD …
Run Code Online (Sandbox Code Playgroud)

performance x86 caching alignment execution

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

C编程,为什么这个大型数组声明会产生分段错误?

此代码在数组声明期间产生分段错误.我很困惑为什么会这样.我故意选择2000000000作为值,因为它低于2 ^ 31并且可以适合整数变量.

int main()
{

    int  nums_size = 2000000000;

    int nums[nums_size];

    int i;
    for(i = 0; i < nums_size; i++) {
        nums[i] = i;
    }


    return 0;

}
Run Code Online (Sandbox Code Playgroud)

c arrays integer

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

寻找虚拟USB HID驱动程序

我们设计了一种特殊的通讯工具,用于轮椅控制灯等.我们使用Z波.我们有应用程序通过PC控制这些设备.

不幸的是,该应用程序需要一个USB棒.我们的设计不允许USB连接棒.相反,我们使用通过蓝牙和虚拟配件链接到电脑的串行接口模块.我们知道该应用程序使用HID标准的windriver.(没有涉及第三方司机)

我们想知道我们是否可以使用HID"包装"驱动程序来模拟USB标识符和PnP,方式是应用程序认为连接棒,然后将蓝牙虚拟配置数据链接到应用程序.

usb virtual-serial-port driver hid

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

物理地址,设备地址和虚拟地址之间的差异

设备地址,物理地址虚拟地址有什么区别?

其实我mmap在司机中试图,我坚持这个概念.

android kernel kernel-module linux-kernel

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

在给定的时间范围内每周五,周六和周日

在不使用PHP5.0的datetime对象的情况下,在两个日期之间获取每个星期五,星期六和星期日的简单方法是什么.

由于速度我不想在1/1和31/12之间遍历每个日期.(作为结果视图的一部分,每页我必须计算至少50次:).

php date

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

优雅地设计一个具有2个重载的方法,一个接受另一个没有的对象

我需要设计一个可以将对象作为参数的方法,如果没有,那么方法必须自己创建一个新对象.

这是一个很好的方法吗?

public void Method1(int companyId, int userId, int clientId)
{
     Method1(null, companyId, userId, clientId);
}
public void Method1(SpecialObject o, int companyId)
{
      if(o == null)
          o = new SpecialObject(userId, clientId);


}
Run Code Online (Sandbox Code Playgroud)

c# oop

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