产品规划roadmap excel怎么做
求推荐一款比较适合敏捷开发团队协作的工具?
求推荐一款比较适合敏捷开发团队协作的工具?
推荐一款功能比较全,上线时间比较快(差不多一周就能交付),最重要的是大部分团队的需求而且价格便宜的产品。
接下来我就直接贴的介绍了,感兴趣看看。
SNAP——企业社交化协作平台
利用移动社交技术,连接企业员工、客户与合作伙伴,构建企业社交三张网,通过多端协作满足不同用户的安全沟通、办公协作、内容分享的一站式服务诉求,形成企业办事的最短路径,大幅提高组织工作效率。
更多详细的内容建议你去官网了解,毕竟一两句话也说不全。
_snap
Java和C# 最大的不同是什么?
我觉得抛开语法而谈,最主要的还是对底层的控制能力不同。
C# 一开始虽然借鉴 Java,但是目的完全不是为了造一个 better Java,而是造一个 better C 。游戏引擎们偏爱 C# 也是有这一层原因在里面。
比如在 C# 里面你能干的:
上述代码会输出 10,为什么?因为 .NET 中数组的长度存储于数组第一个元素之前的 8 字节内存中。如果你再接着输出 *((long*)p - 2),将会直接得到这个对象的 TypeHandle 地址:
然后拿着这个指针又接着能去访问对象的 MethodTable。
再有你还可以手动在栈上分配空间:
接着你想绕过 GC 直接手动分配堆内存:
上述调用等价于你在 C 语言中调用的 malloc,此外还有 AllocAligned、Realloc、AllocZeroed 等等,可以直接控制内存对齐。
接下来你想创建一个显式内存布局的结构 Foo:
然后你就成功模拟出了一个 C 的 Union,之所以会有上面的输出,是因为单精度浮点数 1 的二进制表示为 0x00111111100000000000000000000000,以小端方式存储后占 4 个字节,分别是 0x00000000、0x00000000、0x10000000、0x00111111。
进一步,你还能直接从内存数据没有任何拷贝开销地构造对象:
甚至这样:
从堆内存创建自然也没问题:
再比如,此时你面前有一个使用 C 编写的库,其中有这么一段代码:
然后我们编写如下 C# 代码:
上面的代码干了什么事情?我们将 C# 的函数指针传到了 C 代码中,然后在 C 侧调用 C# 函数生成了一个字符串 wwwww,然后将这个字符串返回给 C# 侧。而就算不用函数指针换成使用委托也没有区别,因为 .NET 中的委托下面就是函数指针。
甚至,如果我们不想让 .NET 导入 foo.dll,我们想自行决定动态库的生命周期,还可以这么写:
上面这些都不是 Windows 专用,在 Linux、macOS 上导入 .so 和 .dylib 都完全不在话下。
再有,我们有一些数据想要进行计算,但是我们想使用 SIMD 进行处理,那只需要这么写:
可以看看在 X86 平台上生成了什么代码:
平台判断的分支会被 JIT 自动消除。但其实除了手动编写 SIMD 代码之外,前两个分支完全可以不写,而只留下:
因为现阶段当循环边界条件是向量长度时,.NET 会自动为我们做向量化并展开循环。
那么继续,我们还有ref、in、out来做引用传递。
假设我们有一个很大的 struct,我们为了避免传递时发生拷贝,可以直接用 in 来做只读引用传递:
而对于小的 struct,.NET 有专门的优化帮我们彻底消除掉内存分配,完全将 struct 放在寄存器中,例如如下代码:
上述代码 GetDistance 考虑是个热点路径,因此我加 来指导 JIT 有保证地内联此函数,最后为 Test 生成了如下的代码:
全程没有一句指令访存,非常的高效。
我们还可以借用 ref 的引用语义来做原地更新:
甚至还能搭配指针和手动分配内存来使用:
C# 的泛型不像 Java 采用擦除,而是真真正正会对所有的类型参数特化代码(尽管对于引用类型会共享实现采用运行时分发),这也就意味着能最大程度确保性能,并且对应的类型拥有根据类型参数大小不同而特化的内存布局。还是上面那个 Point 的例子,我们将下面的数据 int 换成泛型参数 T,并做值类型数字的泛型约束:
无论是 Test1 还是 Test2,生成的代码都非常优秀,不仅不存在任何的装箱拆箱,甚至没有任何的访存操作:
接着讲,我们有时候为了高性能想要临时暂停 GC 的回收,只需要简单的一句:
就能告诉 GC 如果还能分配 128mb 内存那就不要做回收了,然后一段时间内以后的代码我们尽管在这个预算内分配内存,任何 GC 都不会发生。甚至还能阻止在内存不够分配的情况下进行阻塞式 Full GC:
代码执行完了,最后的时候调用一句:
即可恢复 GC 行为。
除此之外,我们还能在运行时指定 GC 的模式来最大化性能:
更进一步,我们甚至可以直接将堆内存中的代码执行,在 .NET 上自己造一个 JIT,直接从内存创建一块可执行的区域然后往里面塞一段代码用来将两个32位整数相加:
除此之外,C# 还有更多数不清的底层写法来和操作系统交互,甚至利用 C# 的编译器取消链接到自己的标准库,直接用从 0 开始造基础类型然后通过 NativeAOT 编译出完全无 GC、能够在裸机硬件上执行引导系统的 EFI 固件都是没有问题的,参考
另外还有 ILGPU 让你把 C# 代码直接跑在 GPU 上面,以及跑在嵌入式设备上直接操作 I2C、PWM、GPIO 等等,就不再举例子了。
而 C# 已经进了 roadmap 的后续更新内容:允许声明引用字段、添加表达固定长度内存的类型、允许传数组时消除数组分配、允许在栈上分配任何对象等等,无一不是在改进这些底层性能设施。
以上就是我认为的 C# 和 Java 最大的不同。
在 C# 中当你不需要上面这些的东西时,它们仿佛从来都不存在,允许动态类型、不断吸收各种函数式特性、还有各种语法糖加持,简洁度和灵活度甚至不输 Python,非常愉快和简单地就能编写各种代码;而一旦你需要,你可以拥有从上层到底层的几乎完全的控制能力,而这些能力将能让你有需要时无需思考各种奇怪的 workaround 就能直接榨干机器,达到 C、C 的性能,甚至因为有运行时 PGO 而超出 C、C 的性能。