Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign up面向过程 :面向过程性能比面向对象高?? #431
面向过程 :面向过程性能比面向对象高?? #431
Comments
|
@ryouaki 感谢,学习了 |
|
我觉得这个得分情况而定,c和c++就是很好的例子,两种语言执行效率差距其实并不大,但是两种语言的设计思想就不同。 |
设计范式和性能无关的。主要是编程语言的运行机制决定的。 |
c和c++的运行机制是一样的。都是编译成机械码。 |
|
感谢 |
|
收益了,感谢 |
|
长知识了 |
|
学习了 |
|
amazing gay |
|
good job |
|
到底是面向过程性能高还是面向对象性能高?这类问题很难回答,非要比较高低的话就必须设定一个场景,否则只能说是各有所长 |
|
另外,现在java 性能不一定低,变化很大了 |
上半年刚测的。 |
|
感觉这个表述-"而是Java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制机械码"不是很准确。最终执行代码不都是二进制码吗?(在此之前是低级语言代码,如汇编)个人觉得可以表述为编译过程的复杂程度的不同导致执行时间的不同(性能的主要度量)。第二,直接比较语言性能本来就是不恰当的。第三,现在的Java今非昔比,底层编译更加优化。第四,有限的测试不具有说服力,具体情况具体分析。 |
|
修正一下是"中间语言代码"。 |
|
可以 |
|
谢谢,学习了 |
|
讨论比回答更精彩。哈哈哈 |
|
java 是解释语言 执行的时候 比直接 编译出来的 二进制执行码多了一个步骤 |
|
学习中 |
|
性能肯定没有面向过程高 但是面相对象后期的维护 还有扩展性 比面向过程好一点------------------ 原始邮件 ------------------
发件人: "zhangzuyi"<notifications@github.com>
发送时间: 2020年3月30日(星期一) 中午1:08
收件人: "Snailclimb/JavaGuide"<JavaGuide@noreply.github.com>;
抄送: "Subscribed"<subscribed@noreply.github.com>;
主题: Re: [Snailclimb/JavaGuide] 面向过程 :面向过程性能比面向对象高?? (#431)
学习中
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub, or unsubscribe.
|
|
@Snailclimb |
|
惊呆了 |
|
同意。语言的执行方式和OOP/POP没有必然的关系。从原理上来讲,OOP的语言也可以直接编译成字节码,而POP的语言也可以解释执行。 |
|
个人理解:JAVA为了一次代码,处处运行(也就是可移植性),有了一层中间码也就是字节码,字节码的作用就是为了可移植性,字节码转换成机器码的工作就交给了java虚拟机,由java虚拟机解释成机器能够运行的二进制机器码。而C语言是直接编译为机器码,机器只需要直接运行二进制机器码即可,而无需和java一样在运行时解释为机器码。从这个角度看,性能与面向过程或对象是无关的。(JAVA只是为了移植性舍弃了一部分性能。) |
|
其实感觉编程范式的侧重点并不在于性能,在于“通过限制你可能出错的细节而给你更多的自由空间”,在Robert.C.Martin的《架构简洁之道》中第三章末尾有对编程范式进行总结
其实也可以这么理解。通过限制goto的使用,我们可以不必在意程序控制权的跳转细节,从而给我们带来了更多的灵活性。通过封装对象的状态,我们可以安全地控制对象所处状态的有效性,从而可以使用更多设计模式。通过限制属性的赋值,我们可以写出无状态的函数与服务,这样就不逼关心函数的可见性与数据一致性,从而更方便地扩展服务。 |
|
编程范式是与具体语言无关的,比如说下面这段代码是使用C语言实现的,这段代码是OOP的,因为它满足继承、封装、多态三个特性,但是它的所有语法使用的都是标准C99语法,执行性能与面向过程的C语言代码没有区别 #include <stdio.h>
#include <stdlib.h>
struct Object
{
int a;
void (*setA)(struct Object *object, int a);
int (*getA)(struct Object *object);
};
struct ObjectExtended
{
struct Object *__super;
void (*setA)(struct Object *object, int a);
int (*getA)(struct Object *object);
};
static void _setA(struct Object *object, int a)
{
object->a = a;
}
static int _getA(struct Object *object)
{
return object->a;
}
static void _setA_extended(struct Object *object, int a)
{
printf("ObjectExtended[%p] set A : %d\n", object, a);
object->a = a;
}
static int _getA_extended(struct Object *object)
{
printf("ObjectExtended[%p] get A : %d\n", object, object->a);
return object->a;
}
struct Object *createObject()
{
struct Object *object = malloc(sizeof(struct Object));
object->setA = _setA;
object->getA = _getA;
return object;
}
struct ObjectExtended *createObjectExtended()
{
struct Object *object = malloc(sizeof(struct Object));
struct ObjectExtended *objectExtended = malloc(sizeof(struct ObjectExtended));
objectExtended->__super = object;
objectExtended->setA = object->setA = _setA_extended;
objectExtended->getA = object->getA = _getA_extended;
return objectExtended;
}
int main(int argc, char **argv)
{
struct Object *object = createObject();
struct Object *objectExtended = createObjectExtended();
object->setA(object, 1);
printf("Object[%p]->getA() = %d;\n", object, object->getA(object));
objectExtended->setA(objectExtended, 2);
printf("Object[%p]->getA() = %d;\n", objectExtended, objectExtended->getA(objectExtended));
return EXIT_SUCCESS;
}这是运行的输出结果 Object[0x7faeb6c017c0]->getA() = 1;
ObjectExtended[0x7faeb6c01800] set A : 2
ObjectExtended[0x7faeb6c01800] get A : 2
Object[0x7faeb6c01800]->getA() = 2; |
|
学习了 |
|
JRocket、Hot Spot jit都是将字节码编译为机器语言,所以我觉的慢除了和解释执行有一定关系; |
|
关于关键词,应该是机器码,而不是机械码 |
|
get! |
|
涨姿势了 |
|
语言的性能与是否面向过程或者面向对象无关,大部分看语言的执行方式,我觉得性能大概是机器码(不用编译)>C,C++(编译)>java(半编译半解释)>html(解释) |
|
硬件场合下决定是否使用某语言的关键因素并不是性能因素,而是这个语言是否是实时性的,而不是使用了何种编程范式。 对于C语言和C++语言来说,所有内存资源的申请与释放都是手动进行的,所有的指令都是以程序员期望的顺序以相同的指令周期顺序执行。 对于Java语言和Golang语言等带自动垃圾回收语言来说,程序会在不适当的时机暂停线程来执行垃圾回收。对于某些任务来说可能期望在几个指令周期内接受所有外部信号并处理完成,在这种情况下暂停线程并执行垃圾回收就会导致信号的丢失。 至于说面向对象与面向过程的性能差异,我上面给出了使用C语言实现面向对象的示例了,而在Linux内核中也大量使用OOP范式来实现对硬件资源的抽象,所以说性能差异是来自于这个语言的执行机制,而不是这个语言采用的编程范式。 |
面向过程 :面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。
----》》
这个并不是根本原因,面向过程也需要分配内存,计算内存偏移量,Java性能差的主要原因并不是因为它是面向对象语言,而是Java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制机械码。
而面向过程语言大多都是直接编译成机械码在电脑上执行,并且其它一些面向过程的脚本语言性能也并不一定比Java好。