为什么golang的开发效率高?
golang是一编译型的强类型语言,它在开发上的高效率主要来自于后发优势,不用考虑旧有恶心的历史,又有一个较高的工程视角。良好的避免了程序员因为“ { 需不需要独占一行 ”这种革命问题打架,也解决了一部分趁编译时间找产品妹妹搭讪的阶级敌人。
它有自己的包管理机制,工具链成熟,从开发、调试到发布都很简单方便;
有反向接口、defer、coroutine等大量的syntactic sugar;
编译速度快,因为是强类型语言又有gc,只要通过编译,非业务毛病就很少了;
它在语法级别上支持了goroutine,这是大家说到最多的内容,这里重点提一下。首先,coroutine并不稀罕,语言并不能超越硬件、操作系统实现神乎其神的功能。golang可以做到事情,其他语言也可以做到,譬如c++,在boost库里面自己就有的coroutine实现(当然用起来跟其他boost库一样恶心)。golang做的事情,是把这一套东西的使用过程简化了,并且提供了一套channel的通信模式,使得程序员可以忽略诸如死锁等问题。
goroutine的目的是描述并发编程模型。并发与并行不同,它并不需要多核的硬件支持,它不是一种物理运行状态,而是一种程序逻辑流程。它的主要目的不是利用多核提高运行效率,而是提供一种更容易理解、不容易出错的语言来描述问题。
实际上golang默认就是运行在单OS进程上面的,通过指定环境变量GOMAXPROCS才能转身跑在多OS进程上面。有人提到了的pomelo,开源本来是一件很不错的事情,但是基于自己对callback hell的偏见,我一直持有这种态度:敢用nodejs写大规模游戏服务器的人,都是真正的勇士 : ) 。
2、Erlang与Golang的coroutine有啥区别,coroutine是啥?
coroutine本质上是语言开发者自己实现的、处于user space内的线程,无论是erlang、还是golang都是这样。需要解决没有时钟中断;碰着阻塞式i\o,整个进程都会被操作系统主动挂起;需要自己拥有调度控制能力(放在并行环境下面还是挺麻烦的一件事)等等问题。那为啥要废老大的劲自己做一套线程放user space里面呢?
并发是服务器语言必须要解决的问题;
system space的进程还有线程调度都太慢了、占用的空间也太大了。
把线程放到user space的可以避免了陷入system call进行上下文切换以及高速缓冲更新,线程本身以及切换等操作可以做得非常的轻量。这也就是golang这类语言反复提及的超高并发能力,分分钟给你开上几千个线程不费力。
不同的是,golang的并发调度在i/o等易发阻塞的时候才会发生,一般是内封在库函数内;erlang则更夸张,对每个coroutine维持一个计数器,常用语句都会导致这个计数器进行reduction,一旦到点,立即切换调度函数。
中断介入程度的不同,导致erlang看上去拥有了preemptive scheduling的能力,而golang则是cooperative shceduling的。golang一旦写出纯计算死循环,进程内所有会话必死无疑;要有大计算量少i\o的函数还得自己主动叫runtime.Sched()来进行调度切换。
3、golang的运行效率怎么样?
我是相当反感所谓的ping\pong式benchmark,运行效率需要放到具体的工作环境下面考虑。
首先,它再快也是快不过c的,毕竟底下做了那么多工作,又有调度,又有gc什么的。那为什么在那些benchmark里面,golang、nodejs、erlang的响应效率看上去那么优秀呢,响应快,并发强?并发能力强的原因上面已经提到了,响应快是因为大量非阻塞式i\o操作出现的原因。这一点c也可以做到,并且能力更强,但是得多写不少优质代码。
然后,针对游戏服务器这种高实时性的运行环境,GC所造成的跳帧问题确实比较麻烦,前面的大神 @达达 有比较详细的论述和缓解方案,就不累述了 。随着golang的持续开发,相信应该会有非常大的改进。一是屏蔽内存操作是现代语言的大势所趋,它肯定是需要被实现的;二是GC算法已经相当的成熟,效率勉勉强强过得去;三是可以通过incremental的操作来均摊cpu消耗。
用这一点点效率损失换取一个更高的生产能力是不是值得呢?我觉得是值得的,硬件已经很便宜了,人生苦短,让自己的生活更轻松一点吧: )。
4、基于以上的论述,我认为采用go进行小范围的MMORPG开发是可行的。
转自:吉勍Personal
http://www.jiqingip.com/page9001?article_id=94
算法处理流程
物流方向的大多数业务算法处理流程基本是按照模型建立、算法开发、算法测试流程进行,具体步骤如下:
模型建立
大多数优化问题都能构建成线性规划、非线性规划或混合整数规划等数学模型。这些模型需要根据实际业务确定,模型主要包含以下因素:
1) 优化目标
2) 决策变量
3) 约束条件
算法开发
模型的求解可根据实际的业务情况(问题复杂程度、数据规模、计算时效要求)等采用合适的精确算法和近似的最优化算法进行求解。
模型精确计算
模型精确求解有一些商业和开源的求解器,如下:Gurobi、Cplex、SCIP、OR-Tools、Glpk等,可以根据实际情况选择合适的求解器。
最优化算法计算
最优化算法也有很多,比如变邻域搜索算法、自适应大邻域搜索算法、禁忌搜索算法、模拟退火算法、遗传算法、蚁群优化算法、粒子群优化算法、人工鱼群算法、人工蜂群算法等,可以根据适用情况选择。
业务相关开放项目计算
解物流领域的某些项目可以利用一些开放性的项目来求解,如求解车辆路径问题的jsprit、求解排程类问题的optaplanner等,这类问题在模型建立好之后可以调用这些开放性项目来求解。
算法测试
生产数据测试
物流方向的项目基本都是优化类型的项目,每个项目对应的业务环节一直在运行,涉及到的优化问题或者是业务系统简单处理,或者人为计算,对于算法有效性的检测可以把这部分生产数据独立抽离出来,经过优化算法计算之后跟原有系统数据进行相关的对比,来评价算法的优化效果。
仿真测试
物流的优化不像互联网应用可以采用流量灰度的方式进行直接的验证,并且物流系统的链路非常长,单点的改变可能引起上下游的变化。在决策优化的过程中需要同时使用优化求解及仿真技术来验证或提供决策依据。仿真测试验证大致需要以下过程:
1) 定义仿真模型确定绩效指标体系
2) 输入算法结果数据到仿真模型进行仿真计算
3) 根据仿真模型的仿真结果计算绩效指标,以反馈算法的优化效果。
算法服务平台建设
实际业务中的很多应用场景都可以抽象成同一类算法问题。算法在解决不同应用场景业务问题时,相关模型、处理流程及计算方法也都大致相同,因此可以对这类问题的算法,按照其处理流程从业务中剥离出来,封装好算法的输入、输出及计算逻辑,构建统一的算法服务平台。
VRP算法服务
比较经典的VRP问题就会应用到很多业务场景,即时配、大件配送、冷链配送、门店补货等。这些业务场景对于大型零售商来说是比较常见的,因此构建可灵活配置的VRP算法服务平台,可达成一次构建,多场景应用的效果。
排班算法服务
排班问题也是一样,无论是生产线工人排班、司机排班、客服排班还是门店工作人员排班,这些都是排班问题应用的业务场景。通过构建可灵活配置的排班算法服务平台,可解决多个业务场景的排班问题。
装箱算法服务
装箱问题也有着丰富的应用场景,无论是商品配送的车辆装箱、运输网络的车型推荐及包装作业的包材推荐都是装箱问题的业务场景。构建灵活的装箱算法服务平台,可通过配置有效的解决各业务场景的装箱问题。
运筹规划算法服务
无论是上面提到的一些算法服务还是其他组合优化问题,都可以构建成运筹优化问题来解决。大家熟知的google or-tools就是组合优化问题的工具包。我们也可以根据自身的业务特点构建适合业务场景的运筹规划算法服务,底层可以调用不同的求解器,可以是商业求解器,如gurobi、cplex等,也可以是开源求解器,如scip、glpk等;也可以是一些最优化算法,如邻域搜索等。
人工智能的三个核心要素:1、数据;2、算法;3、算力。这三个要素缺一不可,相互促进、相互支撑,都是智能技术创造价值和取得成功的必备条件。
1、数据
数据是人工智能发展的基础,图像识别、视频监控等都需要庞大的数据支撑下去进行模型训练和深度学习,数据集有良好的表现并不能保证其训练的机器学习系统在实际产品场景中表现良好。许多人在构建人工智能系统时常常忘了构建一个新人工智能解决方案或产品最困难的部分不是人工智能本身或算法,通常最困难的地方是数据收集和标注。
2、算法
算法是人工智能发展的框架,算法框架能够极大地提高人工智能学习效率。一方面,算法框架降低了深度学习的难度,提供进行深度学习的底层架构、接口,以及大量训练好的神经网络模型,减少用户的编程耗时。另一方面,大部分深度学习框架具有良好的可扩展性,支持将复杂的计算任务优化后在多个服务器的CPU、GPU或TPU中并行运行,缩短模型的训练时间。
3、算力
算力伴随着人工智能出现一直都在提升和发展,相辅相成。如何提升算力成为各国研究的重点,光电计算被提上日程,以三维受控衍射传播实现全并行光速计算为例,这是一个颠覆,采集与计算无缝衔接,突破了存算分离速度制约,速度提升至少千倍,计算频次 1 THz,远超 GHz 电子计算。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)