- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在重构一些性能关键的代码,当我没有得到我希望的结果时,我检查了 ASM 代码(我在每次构建中保留的代码),并注意到对 C 中结构的访问结果3 次昂贵的乘法(这实际上使得代码中的其他优化变得无用,因为 MUL 非常慢 - 约 70 个周期)。
为了更好地了解 vbcc 编译器处理结构的具体情况,我创建了这个简单的测试方法:
void TestMethod (struct SCube * C, struct SVis * V)
{
int i;
char idx;
struct SWall * R;
for (i = 0; i < V->NumLeft; i++)
{
idx = V->Left [i];
R = &C [idx].Left;
R->IsVisible = 1;
}
}
这里是数据结构(请注意,注释中的大小只是未对齐的估计,以粗略地了解每个结构有多大 - 例如,我知道 68000 的对齐规则):
struct SWall /* (5+4*4+2*1,292) = 2,605 Bytes */
{
char PotentiallyVisible;
char IsVisible;
char IsVertical;
char MaterialID;
char LightIdx;
struct SPoint Point [4];
struct SBresenham L1, L2;
};
struct SCube /* 6*2,605 + 1 + 8 = 15,639 Bytes */
{
struct SWall Front, Back, Left, Right, Top, Bottom;
bool IsPartialBack;
short int Imgxp, Imgyp, Imgxl, Imgyl;
};
struct SVis
{
int NumLeft, NumRight, NumTop, NumBottom;
char Left [8], Right [9], Top [8], Bottom [8];
};
这是生成的 ASM 代码(在 -O2 优化级别生成;尚未检查 O3,但 O3 的性能差异可以忽略不计(~2.5%),并且编译时间长 10 倍,并引入其他问题)。我添加了一些注释以使其更具可读性:
public _SScreen_vis1
cnop 0,4
_SScreen_vis1
movem.l l7543,-(a7)
move.l (4+l7545,a7),a3
move.l (8+l7545,a7),a2 a2 = V->NumLeft
moveq #0,d1 d1 = i
tst.l (a2) Early Out (bypass the loop)
ble l7542
lea (16,a2),a1
l7541 Loop Start
move.b (a1)+,d0 d0 = idx = V->Left [i]
ext.w d0
ext.l d0
move.l #15648,d2 d2 = #15648 (sizeof SCube = 15,648)
move.l d0,d3 d3 = d0 = idx
move.l d2,d4 d4 = #15648
swap d3
swap d4
mulu.w d2,d3 d3 = (d3 * d2) = idx * #15648
mulu.w d0,d4 d4 = (d4 * d0) = #15648 * idx
mulu.w d2,d0 d0 = (d0 * d2) = idx * #15648
add.w d4,d3 d3 = (d3 + d4) = (idx * #15648) + (#15648 * idx)
swap d3
clr.w d3
add.l d3,d0
lea (a3,d0.l),a0 a0 = R
move.b #1,(5213,a0) R->IsVisible = 1
addq.l #1,d1 i++
cmp.l (a2),d1
blt l7541 Loop End
l7542
l7543 reg a2/a3/d2/d3/d4
movem.l (a7)+,a2/a3/d2/d3/d4
l7545 equ 20
rts
我检查了整个 ASM 列表,在我使用 1 个结构的每个地方,都有大约 11 个操作与 3 个 MUL 的组合。我能理解 1 MUL,但不能理解 3。
我必须采取哪些选项来加速对结构的访问?我能想到的有这些:
我可以尝试其他经过验证的方法(除了直接使用 ASM 进行编码之外)来加速对结构数组的访问吗?
最佳答案
考虑到idx
取值范围较小,可以使用查表的方式进行指针计算。
static const size_t table[] =
{
sizeof(struct x) * 0,
sizeof(struct x) * 1,
...
};
...
R = (struct x*)((char*)C + table[idx]);
此外,可以使用较小尺寸的表来计算右指针。例如,假设我们的索引范围为 [0..255],但想要使用 16 项表:
static const size_t table[] =
{
sizeof(struct x) * 0,
sizeof(struct x) * 1,
...
sizeof(struct x) * 15
};
...
R = (struct x*)((char*)C + (table[idx>>4] << 4) + table[idx&15]);
关于c - 如何访问 C 中的结构而不在结果 ASM 中进行昂贵的乘法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33065315/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!