2016 - 2024

感恩一路有你

java大数据分发教程 Java和C# 最大的不同是什么?

浏览量:1578 时间:2023-03-26 08:23:41 作者:采采

Java和C# 最大的不同是什么?

我觉得除了语法,最重要的是对底层的掌控能力不同。

虽然C#一开始借鉴了Java,但其目的根本不是为了构建一个更好的Java,而是为了构建一个更好的C,游戏引擎更喜欢C#就是这个原因。

例如,在C#中可以做什么:

上面的代码会输出10,为什么?因为数组的长度。NET存储在数组第一个元素之前的8字节内存中。如果您随后输出*(long *)p-2),您将直接获得该对象的TypeHandle地址:

然后拿着这个指针,就可以访问对象的MethodTable了。

此外,您可以在堆栈上手动分配空间:

然后,您希望绕过GC,直接手动分配堆内存:

以上调用相当于C语言中你调用的malloc,此外还有AllocAligned,Realloc,AllocZeroed等等,可以直接控制内存对齐。

接下来,您希望创建一个具有显式内存布局的结构Foo:

那么你就成功模拟了C的一个并集,之所以会有上面的输出,是因为单精度浮点数1的二进制表示是0x 01111111000000000000000000000000,在小终端模式存储后占用了4个字节,分别是0x00000000000、0x0000000000、0x 000000000。

此外,您可以直接从内存数据构造对象,而无需任何复制开销:

甚至像这样:

从堆内存中创建自然很好:

再比如,此时你有一个用C写的库,里面有这样一段代码:

然后我们编写下面的C#代码:

上面的代码做了什么?我们把C#的函数指针传入C代码,然后在C端调用C#函数生成一个字符串wwwww,然后把字符串返回给C#端。它不 使用委托而不是函数指针并不重要,因为函数指针在。网。

即使我们没有。;我不想要。NET要导入foo.dll,而我们想自己决定动态库的生命周期,我们也可以写:

以上都不是特定于Windows和导入的。所以还有。Linux和macOS上的dylib是完全不可能的。

此外,我们有一些数据,我们想计算,但我们想使用SIMD进行处理,所以我们只需要写:

您可以看到在X86平台上生成了什么代码:

平台判断的分支会被JIT自动淘汰。但事实上,除了手动编写SIMD,代码,前两个分支可以不写,只留:

因为在这个阶段,当循环边界条件是向量长度时,。NET会自动为我们做定向量化,扩展循环。

然后继续,我们还有ref,in和out来传递引用。

假设我们有一个大的struct,为了避免传递时的复制,我们可以直接使用in进行只读引用传递:

对于小型结构,为。NET有特殊的优化来帮助我们完全消除内存分配,并将结构完全放在寄存器中,如下面的代码:

上面的代码GetDistance被认为是一个热路径,所以我添加了它来指示JIT有保证地内联这个函数,最后生成了下面的代码进行测试:

整个过程没有访问内存的指令,效率非常高。

我们也可以借用ref的引用语义来做就地更新:

它甚至可以用于指针和手动分配内存:

与Java不同,C#中的泛型真正专门化了所有的类型参数(虽然运行时分布用于引用类型的共享实现),这意味着性能可以得到最大程度的保证,对应的类型根据类型参数的大小有专门的内存布局。还是上面的点例子,我们将下面的数据int替换为泛型参数t,并对值类型number进行泛型约束:

无论是Test1还是Test2,生成的代码都很优秀,不仅没有打包和解包,而且没有访问操作:

然后,我们有时为了高性能想暂时中止GC恢复,就一句简单的话:

如果你还能分配128mb的内存,你可以告诉GC不要回收,然后一段时间后,即使我们在这个预算中分配内存,也不会发生GC。它甚至可以防止在内存分配不足时阻塞完全垃圾收集:

代码执行完毕,最后一次调用a:

您可以恢复GC行为。

此外,我们还可以指定GC在运行时的模式,以最大限度地提高性能:

此外,我们甚至可以直接在堆内存中执行代码,创建一个JIT。NET中,直接从内存中创建一个可执行区,然后在其中插入一段代码来添加两个32位整数:

除此之外,C#还有无数底层的编写方法与操作系统交互,甚至使用C#的编译器解除与自身标准库的链接,直接从0开始构建基本类型,然后通过NativeAOT编译出完全无GC、可以在裸机硬件上执行引导系统的EFI固件也是没有问题的。

此外,还有ILGPU,它允许您直接在GPU和嵌入式设备上运行C#代码。我可以直接操作I2C,PWM,GPIO等等,就不多举例了。

而C#已经进入了roadmap的后续更新:允许引用字段的声明,增加类型表示定长内存,允许传递数组时消除数组分配,允许栈上任何对象的分配等等。,所有这些都在改善这些基础性能设施。

那个 这是我认为C#和Java最大的区别。

在C#中,当你不 t需要这些东西,它们好像从来不存在,允许动态类型,不断吸收各种功能特性,各种语法糖加持。简单性和灵活性。;甚至不会失去Python,所以你可以愉快而简单地编写各种代码。一旦你需要,你就可以拥有从上到下几乎完全的控制能力,而这些能力会让你在必要的时候不用思考各种奇怪的变通方法,直接把机器榨干,达到C和C的性能,甚至因为运行时PGO而超过C和C的性能。

哪种计算机编程语言更适合未来技术:人工智能,大数据,机器人?

肖晓峰仔细分析道,大数据、人工智能、机器人其实是息息相关的,所以被称为AI时代头号语言的Python无疑是首选语言。

机器人实现的核心是人工智能。而人工智能则是依靠大数据收集和分析,通过各种算法进行深度学习,最终达到目的。Python在这里每个领域都有很强的优势。

1.大数据的收集和分发离不开【爬虫】和【云计算】。Python在爬虫领域几乎是霸主。无论是自动化、高性能异步IO、爬虫策略、分布式爬虫,Python都是最好的解决方案。云计算方面,曾经流行的OpenStack,底层是Python。如果想高度定制,当然用Python。

2.随着5G时代的到来,通信和网络都上了一个新台阶,网络编程是一个重点。Python在协议、封装和解包的底层都有成熟的机制和技术。被称为Python网络框架的四大天王(Django、Tornado、Flask、Twisted),已经足够出名了。

3.科算和分析,Python还是比较强的,大量复杂的科算形成了基于Python的各种库,比如SciPy,NumPy,Matplotlib等等。此外,Python在需要绘制2D和3D图像时没有压力。

4.说到深度学习,不得不提一个高端职业:算法工程师。Python逐渐成为算法工程师的标准语言。在深度学习领域开始火热的PyTorch甚至比TensorFlow还要凶猛,直接决定了Python 人工智能时代的顶级语言地位。

5.机器在人类编程领域,你应该听说过ROS。被称为暴发户的Python已经成为ROS的两大编程语言之一,赶上了C/C胶水 "语言使Python和C/C能够无缝集成。目前越来越多的电子产品开始开箱支持Python。

在自动化运维、桌面软件、游戏开发等领域也有不少表现。我赢了。;这里就不一一列举了。

其实就像我们建筑师大大说的,每一种语言都有自己的特点,用好了就能发挥出最大的价值。Python,Java,C/C,新时代的舞台,都会有他们的影子。另外,最受欢迎的Rust可能也是一匹黑马。

回答完毕,望采纳!让 携手进入人工智能新时代!!!

Python 内存 代码

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。