C# Java和C中unsafe的性能#

C# Java和C中unsafe的性能#,c#,java,performance,image-processing,unsafe,C#,Java,Performance,Image Processing,Unsafe,我正在努力学习数字图像处理,我发现我的朋友在用c。他使用C++的一个非常重要的原因是:C语言中有不安全的< /Cord>关键字,他的代码(算法部分)的性能可以达到C++中相同代码的75%,这对他来说是足够好的。 他鼓励我转向c#,但我是多年的java程序员。我知道java中也有一个不安全的类,但我从未使用过它,不确定它的性能是否与C#一样好 所以我想知道Unsafe在java中的性能,使用java进行图像处理是一个好主意吗 更新 只为一些性能感知任务使用不安全代码,而不是在任何地方都使用它。查

我正在努力学习数字图像处理,我发现我的朋友在用c。他使用C++的一个非常重要的原因是:C语言中有<代码>不安全的< /Cord>关键字,他的代码(算法部分)的性能可以达到C++中相同代码的75%,这对他来说是足够好的。 他鼓励我转向c#,但我是多年的java程序员。我知道java中也有一个
不安全的
类,但我从未使用过它,不确定它的性能是否与C#一样好

所以我想知道
Unsafe
在java中的性能,使用java进行图像处理是一个好主意吗


更新


只为一些性能感知任务使用不安全代码,而不是在任何地方都使用它。

查看此讨论,它同时给出了它的优点和缺点

虽然这篇文章摘自C#文章,但我认为它也适用于Java- 在不安全代码或非托管代码中,可以声明和使用指针。但问题是我们为什么要编写非托管代码?如果我们想要编写与操作系统接口的代码,或者想要访问内存映射设备,或者想要实现一个时间关键的算法,那么使用指针可以带来很多好处


但是使用指针也有一些缺点。如果指针在编译时被选择为32位数量,代码将被限制为4gig的地址空间,即使它在64位机器上运行。如果在编译时将指针选择为64位,则代码无法在32位机器上运行

不安全意味着您可以避免托管环境中的所有开销。所有的范围和类型检查、垃圾收集、反射等。您的代码是否能更快地使用unsafe都取决于您编写的内容。我敢说,主要的优化点是处理大块的原始内存,而不是一系列的像素类或结构,OO会引导你去实现这些类或结构。

我喜欢C#,但由于一个功能选择一种语言而不是另一种语言,这在我看来是一个非常弱的论点。不要根据你朋友的意见,而是根据你的需要和喜好来选择语言!编程语言只是一种工具。你真的会像那样抛弃多年的经验?使用您最熟悉的语言。

刚刚检查过它——“不安全的Java类”,他们说,虽然它提高了性能,但作为最后一种方法,最好也使用C语言。您将失去托管环境的所有优势,并可以选择承担非托管环境的任意多个不利因素。:)我使用了不安全的,并且在使用未经处理的缓冲垫的基础上实现了大约30%的改进。但是,根据您所做的工作,您可以发现使用基本体或对象的常规数组可以提供类似的性能。有人报告说Java比C快很多倍,但我不知道这是怎么回事,也不知道这是否适用于非常具体的情况。我想说,如果您正在执行IO或与“本机”设备或库共享数据,则“不安全”效果很好。我的朋友是一位专家,他的建议对我很重要。我不想求助于.net,但我担心如果我坚持使用Java,而不完成他让我做的一些任务。@Freewind,恕我直言,如果你的“朋友”告诉你,根据这个标准,你需要切换到一个完全不同的平台,那么我会毫不犹豫地称他为“专家”。我必须同意@walther,充其量只是一个C#方面的专家。选择C语言而不是Java语言是有原因的,这不是其中之一,尽管Java不是我喜欢的语言,但我想不出与编程相关的理由来选择C语言而不是Java语言。关于32位指针和64位指针的观点与C#或Java无关——不管您是否直接处理指针,都是无关紧要的,因为底层运行时仍然处理指针。