c#结构与基本类型?

c#结构与基本类型?,c#,struct,C#,Struct,我做了两个基准测试,一个用于我的oop类 class oop { public float[] position = new float[2]; public float[] scale = new float[2]; public float[] rotation = new float[2]; public string name; public int weight; public void setPosition() {

我做了两个基准测试,一个用于我的oop类

class oop {

    public float[] position = new float[2];
    public float[] scale = new float[2];
    public float[] rotation = new float[2];
    public string name;
    public int weight;

    public void setPosition() {
        position[0] = 1.5f;
        position[1] = 3f;
    }

    public void setScale() {
        scale[0] = 1.5f;
        scale[1] = 3f;
    }

    public void setRotation() {
        rotation[0] = 1.5f;
        rotation[1] = 3f;
    }

    public void setName() {
        name = "Gregor";
    }

    public void setWeight() {
        weight = 150;
    }

}
还有一个是我的实体类

class entity {

    // Entity properties
    public position position;
    public rotation rotation;
    public scale scale;
    public name name;
    public weight weight;

}
实体中的每个属性都是一个结构

我试图对它们进行基准测试:

for (long i = 0; i < times; i++) {
    oop test = new oop();

    test.setPosition();
    test.setRotation();
    test.setScale();
    test.setName();
    test.setWeight();
}
for (long i = 0; i < times; i++) {
    entity e = new entity();
    e.position.x = 1.5f;
    e.position.y = 3f;

    e.rotation.x = 1.5f;
    e.rotation.y = 3f;

    e.scale.x = 1.5f;
    e.scale.y = 3f;

    e.name.n = "Gregor";

    e.weight.w = 150;
}

我的问题是:为什么这是可能的?在我的dod类中,我的值与oop类中的值相同,并且我为所有内容设置了相同的值。浮点数组比结构数组慢?我想做一个面向数据的设计,但不是很好,但结果比我的oop类好得多

区别在于两者的内存管理

class oop {

    public float[] position = new float[2];
    public float[] scale = new float[2];
    public float[] rotation = new float[2];
    public string name;
    public int weight;

    public void setPosition() {
        position[0] = 1.5f;
        position[1] = 3f;
    }

    public void setScale() {
        scale[0] = 1.5f;
        scale[1] = 3f;
    }

    public void setRotation() {
        rotation[0] = 1.5f;
        rotation[1] = 3f;
    }

    public void setName() {
        name = "Gregor";
    }

    public void setWeight() {
        weight = 150;
    }

}
结构是值类型,这意味着它们以内联方式存储在其包含的数据类型中

在这里你可以找到一篇很好的文章


您在这里所说的OOP不是OOP,而是类(数组)中的原始数据。你们所说的国防部是OOP,数据被封装和抽象

因此,在所谓的OOP中,有getter和setter,因此循环中有大量的过程调用。在您所谓的DOD中,您没有这些procs调用,而是通过指针直接访问内存(如果您愿意,可以使用引用)。因此速度。。。因为使用真正的OOP(在国防部中)可以提高OOP的速度。尽管我将在下面说,对于某些部分,好的OOP设计可能比非OOP设计更快,因为我想,您没有设置器/获取器

对你的问题的结论是:你的测试是有缺陷的,因为你的设计。因为在所谓的OOP中,即假OOP中,数组有getter和setter(许多大型CPU进程调用ticks)。在您所谓的DOD中,也就是真正的OOP中,我想您没有procs调用,而是直接访问简单值类型的实例成员(这里CPU对内存的访问速度很快)

通常,OOP总是比原始数据访问慢。。。因为CPU过程在可用时调用getter和setter,并且总是因为链接引用访问

一个
A.B.C.D
访问需要至少4个内存指针,其速度要慢4倍(或者最多4个进程调用,非常慢,我不记得i486上的计时,一个调用或跳转比MOV或ADD慢x2到x4或x8),至少大约比一个原始int或数组加上偏移量的引用访问慢一倍,比如说

另一个例子是数组总是比一般列表快

总的来说,OOP总是比非OOP慢:OOP是一门使用内存指针组织数据和代码进行抽象和封装的科学。。。这门科学需要比结构化编程更多的CPU资源,而结构化编程甚至对简单的OOP模拟都是无用的。还有OOP程序调用

但是如果没有OOP,我们就不能做这么多年来所做的伟大的事情:OOP释放了编程技术,并预示着无论我们怎么想都无法想象的事情

要理解这一点,不仅要知道这一点,我们还需要知道CPU是如何工作的

《Bjarne Stroustrup》关于C++起源的一本书是关于“C++的设计和演化”,以及英特尔从开始以来的所有参考手册。 您应该了解处理器如何工作以及汇编语言是什么。所以,您可以看到mov、add、sub、call、ret、jz、jne、jmp的过程调用、内存访问、计时和CPU时钟。。。说明等等

旧的简单的伟大英特尔手册:

英特尔现代手册:

您还可以使用ILSpy或Reflector查看VisualStudio生成的IL代码,并查看如何完成这些工作

这是因为现在我们有很好的CPU,我们可以在.NET或Java或其他平台上进行OOP,而且很快就会有更好的。。。有无量子


你可以在谷歌上搜索关于这些东西的教程和书籍,使用诸如“代码优化”、“.net中间语言(或IL)”、“处理器计时(或滴答声或时钟)”、“汇编助记符(或操作码)”、“汇编语言”、“处理器体系结构”等术语。。。除了“编程理论”

@AlexeiLevenkov,似乎
位置
旋转
。。。structs=)至少我假设了so=)@vivek nuna是的,位置、旋转和缩放包含2个浮点数,名称包含1个字符串和权重1个整数ID您执行发布构建并从命令行运行测试吗?不,我仅从visual studio运行它当从visual studio运行时,某些操作可能会被禁用。调试版本也是如此。@TechWiki-您的
实体
代码无法编译。我假设您打算使用与
oop
示例?@TechWiki相同的类型-不,我可以看到
x
y
属性。你能发表一篇文章让我们自己运行基准测试吗?什么是“procs调用ticks”?我真的不明白你在这里说什么:“OOP释放了编程技术,预示了不可想象的事情,不管我们怎么想。”?1-执行调用或跳转到地址(汇编语言中的过程调用)所需的CPU时钟数或滴答数。例如,一个MOV(分配)或一个JZ(如果)需要1到10个时钟,但如果我记得的话,一个呼叫需要4到50个时钟…|2-我这么说是因为,在今天,有些程序员不喜欢OOP(上一代),但如果没有OOP,我们的世界就不会是现在的样子,也会变成现在的样子。在我看来,你的抽象层次太深了。你做出了一些惊人的错误陈述:“OOP总是比非OOP慢”。是的,OOP慢,因为虚拟表、抽象、封装以及滥用过程调用和引用链接。。。这是事实。有时候,我们可以用一个好的设计来加快一些事情的速度,但总体来说,OOP速度很慢。OOP在最近的10到20年中因CPU而臭名昭著。