毕玄 博客怎么加点

&img src=&/v2-4dbe53dfbc93d_b.jpg& data-rawwidth=&0& data-rawheight=&0& class=&content_image& width=&0&&&p&我这里强调&i&&b&并发&/b&&/i&,因为入门者(包括我)google到的tiny server基本都与&a href=&/?target=http%3A//tinyhttpd.sourceforge.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tiny HTTPd&i class=&icon-external&&&/i&&/a&类似,属于fork-exec模型。但是更加现代的方法是以nginx为代表的异步非阻塞模型,在占用极小资源的情况下实现高并发。&/p&&p&在阅读nginx的代码后,我实现了一个简化版本(~3000 loc, &a href=&/?target=https%3A///wgtdkp/julia& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - wgtdkp/julia: a lightweight high performance http server&i class=&icon-external&&&/i&&/a&), 用来搭建了我自己的blog。而且blog上线以来,尚未崩溃过。&/p&&p&这个server实现(支持)了:&br&&/p&&ol&&li&静态内容本地测试与nginx 1.10(默认配置)性能相当&br&&/li&&li&支持动态内容(转发给uwsgi, 此时服务器相当于反向代理)&br&&/li&&li&完整的request line和头部解析(状态机parser)&br&&/li&&li&简单的memory pool内存管理&br&&/li&&li&简单的访问控制和mime类型映射&br&&/li&&li&支持HTTP/1.1 长连接(超时链接的关闭)&br&&/li&&li&json配置文件&/li&&/ol&&h2&epoll与非阻塞I/O&/h2&&p&这里请看[epoll man](&a href=&/?target=http%3A//man7.org/linux/man-pages/man7/epoll.7.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&epoll(7) - Linux manual page&i class=&icon-external&&&/i&&/a&), 中间有一个例子,对应了服务器中事件处理的主循环。这里面有一个小的细节,struct epoll_event的epoll_data是一个union:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&k&&typedef&/span& &span class=&k&&union&/span& &span class=&n&&epoll_data&/span& &span class=&p&&{&/span&
&span class=&kt&&void&/span& &span class=&o&&*&/span&&span class=&n&&ptr&/span&&span class=&p&&;&/span&
&span class=&kt&&int&/span& &span class=&n&&fd&/span&&span class=&p&&;&/span&
&span class=&kt&&uint32_t&/span& &span class=&n&&u32&/span&&span class=&p&&;&/span&
&span class=&kt&&uint64_t&/span& &span class=&n&&u64&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span& &span class=&n&&epoll_data_t&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&p&我们可以直接将connection bind到其中的ptr,***套接字也同样bind到ptr。在connection中,将socket 套接字置于头部:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&k&&typedef&/span& &span class=&k&&struct&/span& &span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&fd&/span&&span class=&p&&;&/span&
&span class=&c1&&// ......&/span&
&span class=&p&&}&/span& &span class=&n&&connection_t&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&p&这样在epoll_wait返回时,可以这样:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&kt&&int&/span& &span class=&n&&fd&/span& &span class=&o&&=&/span& &span class=&o&&*&/span&&span class=&p&&((&/span&&span class=&kt&&int&/span&&span class=&o&&*&/span&&span class=&p&&)(&/span&&span class=&n&&events&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&].&/span&&span class=&n&&data&/span&&span class=&p&&.&/span&&span class=&n&&ptr&/span&&span class=&p&&));&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&fd&/span& &span class=&o&&==&/span& &span class=&n&&listen_fd&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&c1&&// ......&/span&
&span class=&p&&}&/span& &span class=&k&&else&/span& &span class=&p&&{&/span&
&span class=&n&&connection_t&/span&&span class=&o&&*&/span& &span class=&n&&c&/span& &span class=&o&&=&/span& &span class=&n&&events&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&].&/span&&span class=&n&&data&/span&&span class=&p&&.&/span&&span class=&n&&ptr&/span&&span class=&p&&;&/span&
&span class=&c1&&// ......&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&来分别处理***套接字和connection的套接字。因为在他人的代码中曾经看到这里被实现为map,所以在这里提醒大家。&/p&&h2&错误处理&/h2&&p&错误处理对于写一个long host的server至关重要的。这决定了,你自己的server是否真的能够用起来(尽管功能不全),还是只能作为理解socket编程的漏洞百出的代码。&/p&&p&非阻塞I/O的一个显著特点是I/O操作的状态包含三个:OK, ERROR, AGAIN。这里应该清晰地为每个状态赋予相应的含义。如,在我的设计中,每个request有一个recv buffer和send buffer。那么buffer_read()操作对应的含义是:&/p&&ol&&li&OK:读到EOF,表示对端已关闭链接(不需再读);&br&&/li&&li&ERROR:错误,应该进行相应的错误处理(断开连接,释放资源);&br&&/li&&li&AGAIN: buffer已满,或将陷入等待(仍需再读);&/li&&/ol&&p&buffer_send()操作对应的含义是:&/p&&ol&&li&OK:buffer中的数据全部发送完成(不需再发);&br&&/li&&li&ERROR:错误,应该进行相应的错误处理(断开连接,释放资源);&br&&/li&&li&AGAIN:buffer中的数据未发送完,将陷入等待(仍需再发);&/li&&/ol&&p&不正确的错误处理可能造成服务器的崩溃(如SIGPIPE),应该至少仔细阅读《unix网络编程,卷一》的chapter 5。&/p&&h2&状态机parser&/h2&&p&非阻塞I/O模型要求http server能够处理不完整的request line和头部,并记住当前parse的状态,以便在下一次parse中继续开始,而不至于重头开始。一个显式的规范的状态机就足够处理request line了。状态机之所以管用,是因为request line的统共不过十几个可能的状态,因此实现也不太复杂(parse.c中的函数,只要了解其中一个就好)。另一个讨巧的方法是在recv buffer中判断头部结束符(\r\n\r\n),并记住上一次匹配到的位置,下一次在此位置接着匹配。这样,可以等到头部全部到达再解析。这样的做法稍慢,但是和状态机的复杂度是一样的(O(N))。更多的实现细节,请参考[parse.c](&a href=&/?target=https%3A///wgtdkp/julia/blob/master/parse.c& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&julia/parse.c at master ? wgtdkp/julia ? GitHub&i class=&icon-external&&&/i&&/a&)。&/p&&p&在request的处理中,也涉及到状态机的概念(如,“当前正在处理request line”, “当前正在处理header”, “当前正在处理body”等)。这里并非使用显式的状态变量,而是通过回调函数的置换来达到状态的切换。&br&&/p&&h2&长连接与超时关闭&/h2&&p&因为支持HTTP/1.1 [长连接](&a href=&/?target=https%3A//www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01%23Keep-Alive& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&w3.org/Protocols/HTTP/1&/span&&span class=&invisible&&.1/draft-ietf-http-v11-spec-01#Keep-Alive&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&), 就涉及到超时的非活动连接的关闭。否则,长连接积累将导致资源耗尽。在julia中,长连接被注册到一个最小堆中,connection上的每一次事件,将导致connection的active\_time被更新,同时connection在堆中的位置下移(shift\_down, connection中须有字段记录其在堆中的位置)。这样每次事件循环后,只需考察堆顶connection是否超时,并将之移除。&/p&&h2&动态内容与反向代理&/h2&&p&其它的tiny server在处理动态内容时,一般采用CGI协议。我则与时俱进一点,采用了uwsgi(支持Python后端)。而且,因为它实际支持HTTP协议,这样可以直接将动态请求转发到uwsgi服务器。如此,server的角色就变成了反向代理了。转发的实现很简单,是一个生产者消费者模型:&/p&&ol&&li&前端request到达解析完成,打开后端EPOLLOUT;&br&&/li&&li&后端response到达,打开前端EPOLLOUT;&/li&&/ol&&p&状态的切换应当小心,否则易造成“死循环”(无事件)或者“饥饿”。&/p&&h2&配置文件&/h2&&p&为了方便以后的扩展,julia支持了规范的json格式的配置文件(json解析见我的小轮子[juson](&a href=&/?target=https%3A///wgtdkp/juson& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - wgtdkp/juson: lightweight json parser in c&i class=&icon-external&&&/i&&/a&))。其中,location捕获使其可以区分请求是否需要转发给后端动态内容服务器。&/p&&h2&内存管理&/h2&&p&作为需要在后台长期运行的服务器,小心的内存管理是极为重要的。一个简单的内存池可以帮助分析分配、释放的行为,同时能够对动态分配进行加速。我的实现是,以chunk为单位(若干object),每次在free chunk中分配,不足即调用系统分配(请参考 [base/pool.c](&a href=&/?target=https%3A///wgtdkp/julia/blob/master/base/pool.c& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&julia/pool.c at master ? wgtdkp/julia ? GitHub&i class=&icon-external&&&/i&&/a&))。&/p&&p&应当使用[valgrind](&a href=&/?target=http%3A//valgrind.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Valgrind Home&i class=&icon-external&&&/i&&/a&)来检查server中的内存泄漏问题,每一个byte应当都是严重的泄漏。&/p&&h2&测试&/h2&&p&为了确保我们的状态机parser真的能够处理非连续到达的请求(绝大多数请求都能够在一次I/O事件中到达), [test/client.c](&a href=&/?target=https%3A///wgtdkp/julia/blob/master/test/client.c& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&julia/client.c at master ? wgtdkp/julia ? GitHub&i class=&icon-external&&&/i&&/a&) 模拟了最差的情况,每20ms发送1个字节,以检验server能否正常解析请求。你还应当测试非法请求是否会被server reject。&/p&&h2&其它&/h2&&p&对于阅读源码的同学,这里有一些建议:&/p&&ol&&li&主要关注 server.c, request.c,connection.c, parse.c;&br&&/li&&li&server.c主要关注epoll_wait 事件循环;&br&&/li&&li&request.c 主要关注handle\_pass() handle\_upstream() handle\_response() handle\_request(), 这是请求与转发处理的核心逻辑;&br&&/li&&li&connection.c 包含connection的管理,以及超时连接的移除;&br&&/li&&li&parse.c请只需看其中一个函数,其它类似;&/li&&li&其它的代码属于http的&业务逻辑&以我现在的经验还不能正确地理解和实现,我只实现了其中的部分,但是添加相应的处理逻辑是简单的,请参考request.c中的header handler。&/li&&/ol&&p&完,希望能对初学者有帮助。&/p&
我这里强调并发,因为入门者(包括我)google到的tiny server基本都与类似,属于fork-exec模型。但是更加现代的方法是以nginx为代表的异步非阻塞模型,在占用极小资源的情况下实现高并发。在阅读nginx的代码后,我实现了一个简化版本(~3000 loc,
&img src=&/v2-cbf27edd41_b.jpg& data-rawwidth=&0& data-rawheight=&0& class=&content_image& width=&0&&&p&赵海平团队的新一波招聘开始了。&/p&&p&海平同学是公认的Facebook华人第一人,也是我工作期间的偶像、乒乓球和台球对手之一(哈哈哈)。今天,经由偶像&b&海平同学&/b&委托,小弟覃超在这里给所有有志之士内推,直达有海平同学负责的 infrastructure software department。小魔王我一直以来的原则就是:只推荐精品公司和职位。这次的海平招聘也是类似Airbnb、Facebook的一次难得的机会:&/p&&p&1. 通过面试被招入的人可以直接跟着赵海平工作,这种和世界级大牛工作的机会千载难逢;&br&2. 他们团队负责阿里集群的基础设施,做关于机器性能和效率的优化;比如说优化JVM,让机器容错和吞吐量加大。考虑到阿里集群的巨大,1%的性能提升都会带来巨大的impact。&br&3. 其他server和infrastructure上的新技术改进和使用(比如 docker、borg 等)。&br&4. 工作地方有杭州、北京和&b&美国&/b&&/p&&p&所以别犹豫,内推的链接:&a href=&/?target=https%3A//jinshuju.net/f/8vUv0f& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&「阿里招聘」Infrastructure Software 赵海平&i class=&icon-external&&&/i&&/a&&/p&&br&&img src=&/v2-78ff92add0fdf204c9d8ca_b.jpg& data-rawwidth=&600& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-78ff92add0fdf204c9d8ca_r.jpg&&&p&简介:赵海平同学是我进入Facebook之后结识并开始崇拜的偶像。他毕业于北大细胞生物与遗传学专业,92年拿到纽约大学医学院的Master学位,之后毅然决然地转入其一直向往的计算机行业,并攻读了Princeton University 的MSE。随后在2007年成为Facebook的前50位,也是第一位华人员工,紧跟着在2010驱动了震惊世界的HipHop for PHP项目,去年3月选择离开Facebook回国加入阿里的基础架构事业群,进行TOP Level的底层软件研发,继续为梦想而战。&br&&br&&b&阿里基础架构事业群-基础软件部招聘信息如下:&/b&&br&&img src=&/v2-35eaefa2e5d7_b.jpg& data-rawwidth=&3226& data-rawheight=&2420& class=&origin_image zh-lightbox-thumb& width=&3226& data-original=&/v2-35eaefa2e5d7_r.jpg&&&/p&&ul&&li&招聘岗位:高级底层软件工程师(Kernel、OS、存储系统、JVM等)&br&&/li&&li&工作地点:杭州,北京,美国(任选)&br&&/li&&li&外语要求:无&br&&/li&&li&内推链接:&a href=&/?target=https%3A//jinshuju.net/f/8vUv0f& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&「阿里招聘」Infrastructure Software 赵海平&i class=&icon-external&&&/i&&/a&&/li&&li&薪金待遇:salary + stock(阿里已经上市,stock=cash,且每年以30-50%的速度增长。)&/li&&li&&b&未来研发或从事的以下5个方向:&/b&&/li&&/ul&&b&1.&/b&&b&Docker-based Borg-like cluster and resource management system.&/b&&br&只有Facebook,Google这样级别的公司才会去做的大项目,因为大规模的机器和资源调度只有在这种量级的公司才有节省成本的意义。该项目的工作,技术难度非常大,特别是阿里有它独特的infrastructure software的情况,规模堪比Facebook和Google。该项目希望找到对Docker,Kernel,OS和调度都很熟,对大规模集群调度非常有经验的工程师。&p&&b&2.&/b&&b&New generation storage system&/b&&br&根据2016年发展状况和未来趋势判定,现今的存储系统已经不能满足发展的需要。阿里决定开启一个新一代存储系统项目,基于对软件、分布式系统和硬件认知,根据网络的优化、计算存储分布存储的要求、以及新兴的机器学习对存储系统的要求,重新做一个世界上最大且前所未见的分布式存储系统。这个新型存储系统项目,由前Facebook技术大拿陈威带领团队进行开发。&/p&&p&&b&陈威(一位低调的技术巨牛,却见证了三家巨头的辉煌!)&/b&&br& F
Yahoo! 在Facebook为News Feed的后台开发了第一款基于LSM的高性能内存数据库。&/p&&p&&b&3.&/b&&b&Docker-native kernel and OS&/b&&br&这同样是一项庞大而有难度的工程,目的是去建造一个Docker-native,通过对kernel和OS进行适当修改,做针对Docker进行的适配和优化。目前这个项目Facebook和Google都不敢轻易尝试,阿里希望首先开始做,需要的就是正在看这篇文章的牛人工程师加入进来,比如你。&/p&&p&&b&4.&/b&&b&State of the art JVM&/b&&br&熟悉海平老师的人都知道,这是他的老本行。J***A virtual machine (JVM),这是一直在进行的工作,在此希望深挖JVM方面的人才,做一些尖端的技术改造。因为有海平老师在,阿里的JVM不是任何其它J***A公司所能拥有的,未来开源的项目必定能够毙掉其它所有竞争项目。也许你现在填写一份申请表单,未来就有机会成为开源工程中的一份子。&/p&&p&&b&5.O&/b&&b&ther software &/b&&br&前四个研发或工作项目,应该来说都有一定的难度,也许你不一定对前四个直接感兴趣,但如果对于底层的software有一定心得的话,都可以把简历投来。Other software这一块则主要涉及到DNS,VR(Virtual Reality),性能优化和其它底层的基础软件。&/p&&p&目前阿里的&b&DNS&/b&已经做到非常庞大,具有强大的防攻击特性,未来开源也是一个特牛的piece of software;&b&VR方面&/b&,现在越来越火,很多Engineer都对这块有兴趣,加上前不久Zuck在Oculus的发布会上又大吸了一波粉,而infrastructure software也有负责VR SDK相关的基础技术的部门,他们希望招到计算视觉或图形学的优秀人才,能够将视觉计算相关领域的顶尖算法应用到充满挑战的VR场景中,以最终解决VR应用中用户体验、性能以及软硬件等待突破的难题;而关于&b&性能优化&/b&,主要是在计算机软硬件结合,推动性能优化上下功夫,目的是解决性能优化和容量规划的世界级问题,其中通过将机器学习、优化算法和集团业务三者紧密结合,最终实现智能预测并灵活推荐最大化数据中心的资源利用率的方案。&/p&&p&在我看来,这些都是超级棒的项目,有一种互联网革命前奏的感觉,如果加入其中不仅是个人收入的问题,还会有一种满满的事业的荣誉感吧。此外,还有一些其它的software项目,Infrastructure software也有计划未来针对和围绕员工的背景来为其开发一些项目来做。&/p&&p&最后infrastructure software希望再招一名拥有丰富基础架构软件技能和管理经验的Manager,VP或Director,拥有带50-100人团队经验者优先。(去了就是大BOSS!)&/p&&img src=&/v2-eb68dd5ba59d54da50c1e861_b.jpg& data-rawwidth=&550& data-rawheight=&366& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&/v2-eb68dd5ba59d54da50c1e861_r.jpg&&&p&&b&海平说,&/b&&br&&br&“我们对所有infrastructure software narrative的人都感兴趣,并期待本次招聘能看到很多resume,我们愿意提供更多的机会给对底层和infrastructure software感兴趣的工程师。只要你认为,你有从事以上五个方面中任意一项工作的兴趣和实力,都可以准备好你的简历。阿里巴巴基础架构事业群有信心满足你在技术上和待遇上的任何要求,我们需要技术与雄心兼备的你加入进来。”&/p&&img src=&/v2-09a204da2c4c_b.png& data-rawwidth=&1728& data-rawheight=&1151& class=&origin_image zh-lightbox-thumb& width=&1728& data-original=&/v2-09a204da2c4c_r.png&&&br&&p&预告一下:后续我会有线下更加全面的培训活动,帮助各位能更好地学习计算机算法和编程,同时还有一个关于互联网公司面试冲刺准备的小培训。&/p&&p&当然也有会更多海外公司的招聘信息纷至沓来。Stay tunned~&/p&&p& END&br&- Salvation Lies Within&/p&
赵海平团队的新一波招聘开始了。海平同学是公认的Facebook华人第一人,也是我工作期间的偶像、乒乓球和台球对手之一(哈哈哈)。今天,经由偶像海平同学委托,小弟覃超在这里给所有有志之士内推,直达有海平同学负责的 infrastructure software department…
&img src=&/v2-bdc2d8da1c_b.jpg& data-rawwidth=&0& data-rawheight=&0& class=&content_image& width=&0&&代码评审中偶尔会发现一些通用的性能问题,在此作记录分享。&h2&需求&/h2&&p&我们有时候需要延迟删除 List&T& 中的元素,那时候会先把元素设为 null,最后才一次移除所有空元素。&/p&&h2&优化前&/h2&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&k&&static&/span& &span class=&k&&void&/span& &span class=&n&&RemoveNull&/span&&span class=&p&&&&/span&&span class=&n&&T&/span&&span class=&p&&&(&/span&&span class=&n&&List&/span&&span class=&p&&&&/span&&span class=&n&&T&/span&&span class=&p&&&&/span& &span class=&n&&list&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&p&&=&/span& &span class=&n&&list&/span&&span class=&p&&.&/span&&span class=&n&&Count&/span& &span class=&p&&-&/span& &span class=&m&&1&/span&&span class=&p&&;&/span& &span class=&n&&i&/span& &span class=&p&&&=&/span& &span class=&m&&0&/span&&span class=&p&&;&/span& &span class=&n&&i&/span&&span class=&p&&--)&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&list&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]&/span& &span class=&p&&==&/span& &span class=&k&&null&/span&&span class=&p&&)&/span&
&span class=&n&&list&/span&&span class=&p&&.&/span&&span class=&n&&RemoveAt&/span&&span class=&p&&(&/span&&span class=&n&&i&/span&&span class=&p&&);&/span& &span class=&c1&&// O(n)&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&由于 RemoveAt() 是 &img src=&/equation?tex=O%28n%29& alt=&O(n)& eeimg=&1&& 时间的操作,整个函数是 &img src=&/equation?tex=O%28n%5E2%29& alt=&O(n^2)& eeimg=&1&&。但这个问题只需要 &img src=&/equation?tex=O%28n%29& alt=&O(n)& eeimg=&1&& 时间。&/p&&h2&优化后&/h2&&p&只要把第一个空元素之后的非空元素往前移,就能实现&img src=&/equation?tex=O%28n%29& alt=&O(n)& eeimg=&1&&。&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&k&&static&/span& &span class=&k&&void&/span& &span class=&n&&RemoveNull&/span&&span class=&p&&&&/span&&span class=&n&&T&/span&&span class=&p&&&(&/span&&span class=&n&&List&/span&&span class=&p&&&&/span&&span class=&n&&T&/span&&span class=&p&&&&/span& &span class=&n&&list&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&c1&&// 找出第一个空元素 O(n)&/span&
&span class=&kt&&int&/span& &span class=&n&&count&/span& &span class=&p&&=&/span& &span class=&n&&list&/span&&span class=&p&&.&/span&&span class=&n&&Count&/span&&span class=&p&&;&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&p&&=&/span& &span class=&m&&0&/span&&span class=&p&&;&/span& &span class=&n&&i&/span& &span class=&p&&&&/span& &span class=&n&&count&/span&&span class=&p&&;&/span& &span class=&n&&i&/span&&span class=&p&&++)&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&list&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]&/span& &span class=&p&&==&/span& &span class=&k&&null&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&c1&&// 记录当前位置&/span&
&span class=&kt&&int&/span& &span class=&n&&newCount&/span& &span class=&p&&=&/span& &span class=&n&&i&/span&&span class=&p&&++;&/span&
&span class=&c1&&// 对每个非空元素,复制至当前位置 O(n)&/span&
&span class=&k&&for&/span& &span class=&p&&(;&/span& &span class=&n&&i&/span& &span class=&p&&&&/span& &span class=&n&&count&/span&&span class=&p&&;&/span& &span class=&n&&i&/span&&span class=&p&&++)&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&list&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]&/span& &span class=&p&&!=&/span& &span class=&k&&null&/span&&span class=&p&&)&/span&
&span class=&n&&list&/span&&span class=&p&&[&/span&&span class=&n&&newCount&/span&&span class=&p&&++]&/span& &span class=&p&&=&/span& &span class=&n&&list&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&];&/span&
&span class=&c1&&// 移除多余的元素 O(n)&/span&
&span class=&n&&list&/span&&span class=&p&&.&/span&&span class=&n&&RemoveRange&/span&&span class=&p&&(&/span&&span class=&n&&newCount&/span&&span class=&p&&,&/span& &span class=&n&&count&/span& &span class=&p&&-&/span& &span class=&n&&newCount&/span&&span class=&p&&);&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&List&T& 实际上也提供 &a href=&/?target=https%3A///en-us/library/wdka673a%28v%3Dvs.110%29.aspx& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RemoveAll(Predicate&T&)&i class=&icon-external&&&/i&&/a& 的接口(&a href=&/?target=https%3A///Microsoft/referencesource/blob/master/mscorlib/system/collections/generic/list.cs%23L842& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&参考实现&i class=&icon-external&&&/i&&/a&),可以 &img src=&/equation?tex=O%28n%29& alt=&O(n)& eeimg=&1&& 完成相同工作。但在目前 Unity 的 IL2CPP 下,因 delegate 的调用成本,自行实现会稍快一些。&/p&&p&C++ 可用 &a href=&/?target=http%3A///w/cpp/algorithm/remove& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&std::remove, std::remove_if&i class=&icon-external&&&/i&&/a&,因为支持内联不需考虑调用成本。&/p&&p&(题图 &a href=&/?target=https%3A///photos/7Od26RsZ2Rk& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Photo by Adam Wilson&i class=&icon-external&&&/i&&/a&)&/p&
代码评审中偶尔会发现一些通用的性能问题,在此作记录分享。需求我们有时候需要延迟删除 List&T& 中的元素,那时候会先把元素设为 null,最后才一次移除所有空元素。优化前static void RemoveNull&T&(List&T& list) {
for (int i = list.Count - 1; i &= 0…
&img src=&/a8abc6a2a15d0a674ccf8e_b.jpg& data-rawwidth=&700& data-rawheight=&6500& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/a8abc6a2a15d0a674ccf8e_r.jpg&&&img src=&/b90d6b2d640e52a946ca_b.jpg& data-rawwidth=&700& data-rawheight=&6500& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/b90d6b2d640e52a946ca_r.jpg&&&img src=&/7a18bb14e47ce223a07be7_b.jpg& data-rawwidth=&700& data-rawheight=&5948& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/7a18bb14e47ce223a07be7_r.jpg&&
贴一篇我专栏里的文章(&a href=&/p/& class=&internal&&一篇文章带你了解 Java 服务端单元测试的方方面面 - Not A Geek? - 知乎专栏&/a&),主要写的是 Java 单元测试。不过原理应该是相通的。&br&&br&我在知乎专栏 &a href=&/notageek& class=&internal&&Not A Geek? - 知乎专栏&/a& 会不定期写更新一些编程方面的文章,欢迎大家关注。&br&&br&&p&单元测试最直接的好处有两点:&/p&&p&1. 让你写出更好的代码:职业高内聚、低耦合而且接口设计合理的代码才易于测试;&/p&&p&2. 让你在修改代码时更有信心。&/p&&br&然后我们来举个例子,假设我们有个 add(a, b) 函数:&img src=&/19db825debc1d8aa3afc79_b.png& data-rawwidth=&1168& data-rawheight=&134& class=&origin_image zh-lightbox-thumb& width=&1168& data-original=&/19db825debc1d8aa3afc79_r.png&&&p&现在想测试它,于是用 &a href=&///?target=http%3A//junit.org/junit4/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JUnit&i class=&icon-external&&&/i&&/a& 写个简单的测试函数:&/p&&img src=&/bd26a37bd1b482f89fe671a_b.png& data-rawwidth=&1168& data-rawheight=&156& class=&origin_image zh-lightbox-thumb& width=&1168& data-original=&/bd26a37bd1b482f89fe671a_r.png&&&p&你传入参数,调用 add 函数,然后很快能得到结果,对比期望值就能知道函数功能是否正常。这种验证方式叫做状态验证(state verification)。&/p&&br&&p&但是真实项目中的代码要复杂的多。&/p&&p&比如,这段代码从数据库中查询数据:&/p&&img src=&/b432b4afef9b88b09f4a1a5080b59edf_b.png& data-rawwidth=&1164& data-rawheight=&128& class=&origin_image zh-lightbox-thumb& width=&1164& data-original=&/b432b4afef9b88b09f4a1a5080b59edf_r.png&&&p&如果要测试以上代码,你有几种选择:&/p&&p&1. 连接一个“真实”的数据库;&/p&&p&2. 选择内存数据库,比如 &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&h2&i class=&icon-external&&&/i&&/a&;&/p&&p&3. 创建 &a href=&///?target=https%3A//en.wikipedia.org/wiki/Mock_object& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mock&i class=&icon-external&&&/i&&/a& 对象,在测试时代替 jdbcTemplate。&/p&&p&第 1 种方式最直接,不过依赖外部数据库会降低单元测试的效率,如果环境出现问题,比如网络不稳定,单元测试还会出错。第 2 种方式是我们推荐的做法,我们可以认为 &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&h2&i class=&icon-external&&&/i&&/a& 是 &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MySQL&i class=&icon-external&&&/i&&/a& 的 fake 对象(当然你选用其他内存数据库,或者自己写一个内存数据库也可以 : P)。我们在生产环境使用 &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MySQL&i class=&icon-external&&&/i&&/a&,而在单元测试/集成测试的时候,则选用 &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&h2&i class=&icon-external&&&/i&&/a&,当然这种方法也有一个问题:&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&h2&i class=&icon-external&&&/i&&/a& 不可能和 &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MySQL&i class=&icon-external&&&/i&&/a& 完全兼容,所以我们需要改写部分不兼容的语句,或者用其他方式比如第 3 种方式测试它们。以上两种测试方法也是状态验证(state verification)。&/p&&br&&p&我们来详细谈谈第 3 种方式。让我们看看 &a href=&/mockito.org& class=&internal&&Mockito&/a& 版本的单元测试代码:&/p&&img src=&/fbb8d4edbbc0ae573bff_b.png& data-rawwidth=&1164& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&1164& data-original=&/fbb8d4edbbc0ae573bff_r.png&&&p&单元测试一般分为四个步骤:setup、exercise、verify、teardown。用上面的代码举例,setup 阶段,我们创建了 mock 对象,并且设置了 queryForInt 的行为;exercise 阶段调用了测试函数;verify 阶段做了两件事情:1. 确认 queryForInt 函数被正确调用,2. count() 返回值符合预期;teardown 阶段一般用来清理和释放资源,我们这里不需要,直接跳过了。&br&&/p&&br&&p&这种利用 &a href=&///?target=https%3A//en.wikipedia.org/wiki/Mock_object& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mock &i class=&icon-external&&&/i&&/a&对象的测试叫做行为(behavior verification)。回到我们要测试的 count() 函数:我们调用了 jdbcTemplate 类的 queryForObject 函数从数据库中查询数据。我们要测试的是自己的业务逻辑,所以我们认为 jdbcTemplate 和数据库是可靠的(即使不可靠也不应该由我们的单元测试来验证),如果我们向 jdbcTemplate 传了正确的参数,后者就会向数据库发起正确的请求,然后得到正确的结果,换句话说,我们只要验证是否正确地调用了 jdbcTemplate 就行了。于是,我们可以创建一个模拟对象,即 &a href=&///?target=https%3A//en.wikipedia.org/wiki/Mock_object& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mock&i class=&icon-external&&&/i&&/a& 对象,在测试的时候代替 jdbcTemplate。 这个对象可以完全由我们自己编写:实现特定接口,继承特定类,或者用动态代理,甚至修改字节码,它不会真正的访问数据库,但会保存你的调用行为,以便你来验证是否请发起了正确的请求。 当然,绝大部分情况, &a href=&///?target=https%3A//en.wikipedia.org/wiki/Mock_object& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mock&i class=&icon-external&&&/i&&/a& 对象的实现细节不用你辛辛苦苦写出来。Java 社区有一大堆开源项目可以选择,比如:&a href=&/mockito.org& class=&internal&&Mockito&/a&、&a href=&/easymock.org& class=&internal&&EasyMock&/a&、&a href=&///?target=https%3A///jayway/powermock& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PowerMock&i class=&icon-external&&&/i&&/a&、&a href=&/www.jmock.org& class=&internal&&JMock&/a& 和 &a href=&/jmockit.org& class=&internal&&JMockit&/a& 等。这么多工具,该如何选择呢,可以看看 &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&stackoverflow&i class=&icon-external&&&/i&&/a& 上的一个问题: &a href=&///?target=http%3A///questions/22697/whats-the-best-mock-framework-for-java& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&What's the best mock framework for Java&i class=&icon-external&&&/i&&/a&。简单的建议:使用 &a href=&/mockito.org& class=&internal&&Mockito&/a& 结合 &a href=&///?target=https%3A///jayway/powermock& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PowerMock&i class=&icon-external&&&/i&&/a&,需要自己写 fake 对象时选择 &a href=&/jmockit.org& class=&internal&&JMockit&/a&。&/p&&br&&p&测试中过程中,什么时候使用 &a href=&///?target=https%3A//en.wikipedia.org/wiki/Mock_object& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mock&i class=&icon-external&&&/i&&/a& 对象,也形成了 Classical 和 Mockist 两种不同的测试风格。我个人以前是 Mockist 风格,现在偏向 Classical,不过这里不展开了,如果想进一步了解,可以看 Martin Fowler 的经典文章 &a href=&///?target=http%3A///articles/mocksArentStubs.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mocks Aren't Stubs&i class=&icon-external&&&/i&&/a&。&/p&&br&&p&说回到项目,实际的项目往往依赖了各种框架和组件,在动手为它们写 fake/mock 对象之前,可以看看社区是不是已经有了支持,比如:Spring 有 Spring Test、Spring MVC Test;涉及到 Zookeeper,Netflix 提供了&a href=&///?target=https%3A///Netflix/curator/wiki/Utilities& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&in-process ZooKeeper server&i class=&icon-external&&&/i&&/a& 。如果你使用 maven 等构件工具构件你的项目,你还可以利用构件工具以及它们的插件做更多事情,比如:利用多线程提高测试效率,只执行特定的测试代码,生成测试报告等等。通常,我们也会利用 jenkins 等持续集成工具定时/有代码变更时运行单元测试,保证修改不会破坏已有的代码功能。&/p&&br&&p&另外,测试遗留代码也是一个巨大的挑战,你需要把代码重构到“可测试”的状态,《修改代码的艺术》在这方面一定可以帮到你。&br&&/p&&br&&p&扩展阅读:&/p&&p&1.《单元测试之道》&/p&&p&2.《修改代码的艺术》&/p&&p&3. &a href=&///?target=http%3A///articles/mocksArentStubs.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mocks Aren't Stubs&i class=&icon-external&&&/i&&/a&&/p&
贴一篇我专栏里的文章(),主要写的是 Java 单元测试。不过原理应该是相通的。 我在知乎专栏
会不定期写更新一些编程方面的文章,欢迎大家关注。 单元测…
&p&10/18更新&br&&img src=&/v2-7ebebfcdc47d87cd1e2e0ad_b.png& data-rawwidth=&1344& data-rawheight=&1008& class=&origin_image zh-lightbox-thumb& width=&1344& data-original=&/v2-7ebebfcdc47d87cd1e2e0ad_r.png&&&/p&&br&目前人工智能芯片领域的公司,知乎和网络上有一直有朋友们在询问。所以我们矽说大致做了一个整理(以已公开宣传的公司为主,一些低调的公司就没放入),供大家&按图索骥&地参考。&br&另外,如果大家在这张图里觉得有不合适的、不准确的、或是有遗漏的等,欢迎提供建议和讨论。之后我们也会经常修正和更新。万分感谢~&br&&br&排序不分先后&br&&ul&&li&&b&ASIC&/b&&/li&&/ul&Mobileye &a href=&///?target=https%3A///link%3Furl%3DYOeZoE6cWHrHFCvIer07_xZ3iG1u17n5L8Bd0KAziELCg2JmnCw2Bk4uwrmJ59-h%26wd%3D%26eqid%3D8f8ddede280& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/&i class=&icon-external&&&/i&&/a&&br&Cambricon(寒武纪科技)&a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Wave Computing &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Wave Computing&i class=&icon-external&&&/i&&/a&&br&Horizon Robotics(地平线机器人)&a href=&///?target=http%3A//www./index_cn.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/in&/span&&span class=&invisible&&dex_cn.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&Cerebras Systems &a href=&///?target=http%3A//cerebras.net/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&cerebras.net/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Nervana &a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Movidius &a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Mediatek(联发科)&br&NXP&br&Netradyne &a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&ChipIntelli(启英泰伦)&a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&IntelliFusion(云天励飞)&a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&&ul&&li&&b&GPU/CPU/TPU&/b&&/li&&/ul&Nvidia&br&AMD&br&Qualcomm&br&Intel&br&Google&br&&ul&&li&&b&IP/DSP&/b&&/li&&/ul&CEVA
&a href=&///?target=http%3A//www./& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Kneron(耐能人工智能)&a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Synopsys &br&Cadence&br&&ul&&li&&b&FPGA&/b&&/li&&/ul&TeraDeep
&a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&DeephiTech(深鉴科技)&a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Microsoft &br&Auviz Systems &a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Xilinx&br&Altera&br&Baidu(百度)&br&&ul&&li&&b&Neuromorphic&/b&&/li&&/ul&IBM&br&HRL Laboratories &a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Numenta &a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Knupath &a href=&///?target=https%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Brain corp &a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&General Vision &a href=&///?target=http%3A//www./& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Demiurge Technologies AG &a href=&///?target=http%3A//www.demiurge.technology/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&demiurge.technology/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Westwell lab(西井科技)&a href=&///?target=http%3A//www./index.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/index.&/span&&span class=&invisible&&html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&Brainchip &a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&Saffron &a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&&p&------------------------------------以下为9/8更新------------------------------------&br&9/8更新:距离4月10日的第一次发布这个回答刚好5个月过去了~ 这个领域的发展实在是太快了,短短的几个月时间里:&/p&&p&英特尔买买买地收购了Nervana、Movidius;孙正义收购了ARM;Google推出了TPU;Xilinx收购了Auviz System...国内深鉴科技、云天励飞等公司也走向了前台。&/p&&br&&p&&a href=&///?target=https%3A//mp./s%3F__biz%3DMzA3MzI4MjgzMw%3D%3D%26mid%3D%26idx%3D3%26sn%3De07ccbd6c81bfa6e5a91dd%26scene%3D1%26srcid%3D0908wUvHGnLGjH2Fhn3NNQiV%26pass_ticket%3DoVFsRXP%252F8VYCRjYTXHnRLdZKisvsQUM1olQJhDdNjagTDtgBQotBGbjBXW088%252F9x%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&专题 | 聚焦人工智能芯片:「机器之心」携「矽说」共同打造「脑芯编」(申请入群)&i class=&icon-external&&&/i&&/a&&br&&/p&&p&「机器之心」和「矽说」合作会在接下来的一段时间里发布关于人工智能芯片的一系列文章「脑芯编」,揭秘人工智能芯片的过去、现在与未来。&br&&/p&&p&欢迎大家关注「机器之心」和「矽说」公众号上的相关内容,我们的「&a href=&/silicontalks& class=&internal&&矽说 silicon talks - 知乎专栏&/a&」之后也会持续更新相关文章。&/p&&br&&p&ps:另外我们也将建一个人工智能芯片硬件相关领域的微信交流群,为大家提供一个高质量的讨论交流平台。欢迎业界学界的朋友们一起来加入:)&/p&&p&(人工智能芯片硬件相关领域有兴趣的朋友可以填写这个链接:&a href=&///?target=http%3A///survey/69e11a55-6f6d-44b9-baf0-31ccf8a946f7& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&人工智能芯片硬件交流群申请链接&i class=&icon-external&&&/i&&/a&,主要是为了保证群内的交流质量,敬请谅解^^)&/p&&br&&p&几间新创公司:&/p&&p&&a href=&///?target=http%3A//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Kneron&i class=&icon-external&&&/i&&/a&&br&&/p&&img src=&/f3b7bbb614ad576f1e979d1d5eead19c_b.jpg& data-rawwidth=&1535& data-rawheight=&1469& class=&origin_image zh-lightbox-thumb& width=&1535& data-original=&/f3b7bbb614ad576f1e979d1d5eead19c_r.jpg&&&br&&p&&a href=&///?target=http%3A//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Wave Computing&i class=&icon-external&&&/i&&/a&&br&&/p&&img src=&/fc0528153cab3_b.jpg& data-rawwidth=&1536& data-rawheight=&1824& class=&origin_image zh-lightbox-thumb& width=&1536& data-original=&/fc0528153cab3_r.jpg&&&br&&p&&a href=&///?target=http%3A///index.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/index.htm&/span&&span class=&invisible&&l&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&img src=&/b1e4eed8d43e295e8ff10_b.jpg& data-rawwidth=&1536& data-rawheight=&1828& class=&origin_image zh-lightbox-thumb& width=&1536& data-original=&/b1e4eed8d43e295e8ff10_r.jpg&&&br&&br&&br&&p&--------------------------------------以下为原文------------------------------------&br&&/p&&p&&br&如果不局限在「专用」这点(单一专用的一颗)上的话其实之前就已经有很多芯片厂商开始涉足Deep
Learning或者说神经网络芯片,并且已经有产品投入市场了。&/p&&br&&p&印象特别深,阿尔法狗首次大战李世石的那个下午,联发科的技术副处长梁伯嵩博士来做了个题目为「Toward
a converged smart world (?向融合的智能世界) 」的演讲。那时边听报告边刷手机看最新的战况,报告进行到大概一半,人机大战首局就以机器获胜而告终。 &/p&&p&&br&这个报告主要是讲MTK未来IC研发的一些侧重点。大纲的几个大标题里第一个就是Deep Learning,其他的是像IoT、5G、自动驾驶、机器人等等的热门领域。可惜是针对本科生的报告,很多细节都没有展开,后来处长也先离场了没有来得及细问。但是可以知道的是,一些快的或者看中这方面的芯片大厂之前就已经开始有这方面的布局和研发。梁博士就有提到,将来在比如无法连接网络的实际应用情况下,各种终端设备(比如手机)能不能依然提供良好的图像识别或是语音识别等的服务,这就需要的相关移动端的芯片技术。&/p&&br&&p&因为其实像IoT、汽车电子(自动驾驶)、机器人等的半导体厂商未来的兵家必争之地,或多或少会用到Deep
Learning的技术,大家应该都会想有自己在这方面的竞争力,目前来看,投入市场的主要以图像处理、驾驶辅助等的方面为主。&/p&&br&&p&从学界看,今年ISSCC的Session 14 Next-Generation Processing 7篇文章里有6篇Neural Network Accelerator主题的,IEEE SPECTRUM专门做了报道,中文可以参考机器之心的文章:&a href=&///?target=https%3A//mp./s%3F__biz%3DMzA3MzI4MjgzMw%3D%3D%26mid%3Didx%3D3%26sn%3D732b03acc51d2fb9a58bbfd4a2a9d5bd%26scene%3D1%26srcid%3D0410949nrnMcSeM9ihQ0VCDQ%26pass_ticket%3DzVinN6n2FVnNNXTdRNH5irpxXXN0a5I%252BPwsGF5RyZshw686NFDqW4pYGoRWGJ882%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&前沿 | 借助神经网络芯片,将大型人工智能系统塞入移动设备&i class=&icon-external&&&/i&&/a&。 &/p&&p&这些16年的paper在15年九十月份都完成投稿了,那设计、流片、测试整个流程下来就更早了(可能起码要一年),其中有些也已经不只是第一版了。&/p&&p&半导体行业里业界的研发一般都会领于与学术界,所以其实不少公司也应该在很早前就开始了相关的研发甚至已经有投入市场的产品了。比如:&/p&&br&&p&MediaTek 联发科&/p&&p&联发科最近发布的十核Helio
X20中就有深度学习相关的SDK&/p&&img src=&/406a012df2a6caa7e1f6_b.jpg& data-rawwidth=&840& data-rawheight=&433& class=&origin_image zh-lightbox-thumb& width=&840& data-original=&/406a012df2a6caa7e1f6_r.jpg&&&p&看看MTK正妹的介绍视频:&/p&&p&&a href=&///?target=http%3A///watch/.html%3Fpage%3DvideoMultiNeed& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MediaTek Deep Learning SDK on helio X20 with Visual and Voice Recognition features&i class=&icon-external&&&/i&&/a&&/p&&p&”So this is not on the cloud? ”&/p&&p& “Yeah… they can do
it on the device, so it is safer with privacy.”&/p&&p&油管视频:&/p&&p&&a href=&///?target=https%3A///watch%3Fv%3DovtAvbn4Xcs& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MediaTek Deep Learning SDK on helio X20 with Visual and Voice Recognition features&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=https%3A///watch%3Fv%3DefXROSbpurk& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MediaTek Deep Learning&i class=&icon-external&&&/i&&/a&&/p&&br&&p&Qualcomm 高通 &/p&&p& “Zeroth”平台,有应用在骁龙820之中(图像识别、指纹识别等应用)。&/p&&img src=&/ab160f96db331bdb72fa855f_b.png& data-rawwidth=&500& data-rawheight=&315& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/ab160f96db331bdb72fa855f_r.png&&&p&&a href=&///?target=https%3A///news/onq//qualcomm-zeroth-advancing-deep-learning-devices-video& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Qualcomm Zeroth is advancing deep learning in devices [VIDEO]&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///v_show/id_XMTQxOTc3OTU4MA%3D%3D.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Qualcomm Zeroth 平台&i class=&icon-external&&&/i&&/a&&/p&&br&&p&NVIDIA 英伟达 &/p&&p&这两天的新闻很多,不多做介绍了。&/p&&p&&a href=&///?target=https%3A///deep-learning& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/de&/span&&span class=&invisible&&ep-learning&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&/p&&p&而且NVIDIA在汽车和先进驾驶辅助系统(ADAS)方面的工作也是很早之前就开始了,与奥迪、特斯拉、奔驰、沃尔沃、宝马、本田等的合作也时常上新闻。&/p&&p&&a href=&///?target=http%3A//.tw/object/automotive-partner-innovation-tw.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&.tw/object/au&/span&&span class=&invisible&&tomotive-partner-innovation-tw.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&br&&p&Intel 英特尔
&/p&&p&上文提到的ISSCC 216中,Intel就有一篇,不过是KNN相关的(A 21.5M-Query-Vectors/s 3.37nJ/Vector Reconfigurable k-NearestNeighbor Accelerator with Adaptive Precision in 14nm Tri-Gate CMOS)。 &/p&&p&Intel 近几年来收购了Indisys、Xtremeinsights、Altera、Saffron等相关的好几家人工智能或芯片公司。&/p&&br&&p&NXP 恩智浦----Freescale 飞思卡尔----Cognivue &/p&&p&Cognivue 是一家拥有CNN相关的图像处理APEX技术的公司。和Freescale合作之后被Freescale收购,再后来Freescale被NXP买下,所以现在这一技术在恩智浦:&a href=&///?target=http%3A///zh-Hans/products/automotive-products/microcontrollers-and-processors/image-cognition-processors/image-cognition-processors%3ASCP2200%3Ffsrch%3D1%26sr%3D5%26pageNum%3D1%25E4%25B8%258B%25E4%25B8%%25A1%25B5& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&图像识别处理器&i class=&icon-external&&&/i&&/a&。&/p&&img src=&/3f2c54c144debbd891b5e_b.png& data-rawwidth=&668& data-rawheight=&830& class=&origin_image zh-lightbox-thumb& width=&668& data-original=&/3f2c54c144debbd891b5e_r.png&&&br&&p&Hisilicon 海思&/p&&p&海思可能也有相关的工作,之前有看到他家图像芯片相关的一点零星介绍,还看到一份14年的招聘信息,不知道有没有知情人士可以透露一点。&/p&&img src=&/077b7c96f656ef9ba700ba4fee7e5885_b.png& data-rawwidth=&716& data-rawheight=&184& class=&origin_image zh-lightbox-thumb& width=&716& data-original=&/077b7c96f656ef9ba700ba4fee7e5885_r.png&&&br&&br&&p& IP公司CEVA
&/p&&p&&a href=&///?target=http%3A//www./CDNN& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CEVA Deep Neural Network (CDNN)&i class=&icon-external&&&/i&&/a&&br&&/p&&img src=&/d61bec1134_b.png& data-rawwidth=&614& data-rawheight=&176& class=&origin_image zh-lightbox-thumb& width=&614& data-original=&/d61bec1134_r.png&&&img src=&/5a0ff5f669cce496f82ee4d517c429b0_b.png& data-rawwidth=&1000& data-rawheight=&411& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/5a0ff5f669cce496f82ee4d517c429b0_r.png&&&img src=&/16f43b35a3ad3a95ac1ad24fbcbd975b_b.png& data-rawwidth=&1000& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/16f43b35a3ad3a95ac1ad24fbcbd975b_r.png&&&br&&p&这家有提供一个完整的开发平台:&a href=&///?target=http%3A//www./CEVA-XM4& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CEVA-DSP XM4&i class=&icon-external&&&/i&&/a&。应用于对象和场景识别,汽车高级驾驶员辅助系统(ADAS),人工智能(AI),视频分析,增强现实(AR),虚拟现实(VR)和类似的计算机视觉应用。&/p&&br&&p&Mobileye 以色列公司&br&&/p&&p&这家公司网络上有很多报道,产品EyeQ chip也很有名,之后在不上详细的内容。&/p&&br&&p&新创公司也有很多已经做的不错了的:&/p&&p&Movidius
&/p&&img src=&/bf5c0ccdf146fa0d23d2c4_b.png& data-rawwidth=&1071& data-rawheight=&458& class=&origin_image zh-lightbox-thumb& width=&1071& data-original=&/bf5c0ccdf146fa0d23d2c4_r.png&&&img src=&/c94e5e895e9d8ee89f2ab52418fccf83_b.png& data-rawwidth=&416& data-rawheight=&824& class=&content_image& width=&416&&&p&2014年,Movidius和Google合作,将他们推出的首颗芯片Myriad 1应用到Project Tang中。&/p&&p&最近,Movidius 上头条是因为,大疆的新款无人机Phantom
4采用了Myriad 2芯片:&/p&&p&&a href=&///?target=http%3A///v_show/id_XMTUwMjIyMjg4MA%3D%3D.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Movidius and DJI Bring Vision-Based Autonomy to Phantom 4&i class=&icon-external&&&/i&&/a&&/p&&br&&br&&ul&&li&上面介绍的主要是基于机器学习相关的人工神经网络芯片,而其实还有很大的一支,是基于从类似或模拟生物神经系统的来实现的Neuromorphic Engineering(神经形态网络芯片)&/li&&/ul&&img src=&/bdc7db85f327b3fec288f39_b.png& data-rawwidth=&591& data-rawheight=&329& class=&origin_image zh-lightbox-thumb& width=&591& data-original=&/bdc7db85f327b3fec288f39_r.png&&Ref: Fernando Morgado Dias, AnaAntunes, and Alexandre Manuel Mota. Articial neural networks: a review ofcommercial hardware. Engineering Applications of Artificial Intelligence,17(8):945-952, December 2004.&br&&br&&p&关于神经形态芯片的介绍可以参考这个回答:&a href=&/question//answer/& class=&internal&&IBM 发布新型 SyNAPSE 神经网络芯片,会对整个计算机乃至科技领域产生什么影响? - 薛矽的回答&/a&&br&&/p&&br&&p&因为目前人工智能芯片领域仍然处于一个相当起步的阶段,关于这些不同的发展方向,存在很多争议,有人认为像人类制造飞机来飞行而不需要学习鸟类的飞行技术一样,人工智能芯片的实现并不一定需要和生物大脑的构造或运行一模一样;而有的人认为通过研究大脑,学习大脑,模拟大脑,而从中得到启发,可以帮助我们更好地进行人工智能的研究。&/p&&br&&p&目前来看,孰是孰非来下结论还为时过早,很多大公司也在这两方面同时都有布局,最终的结局也可能是还是要由市场用money来投票。所以这边还是要提一下神经形态网络芯片相关的公司:&/p&&br&&p&General Vision、IBM(TrueNorth)、Westwell lab、Intel收购的Saffron、Aziana和BrainChip的合并&a href=&///?target=http%3A///technology/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Technology | BrainChip&i class=&icon-external&&&/i&&/a&、HRL Laboratories、Audience、Numenta、Braincorporation等等。&/p&&br&&br&&ul&&li&另外关于硬件、算法这两者相关的问题,从IC Design的角度分享一个观点供参考:下文提到的那位二次创业的大咖前辈说他从美帝回台湾之后,大概花了两年时间思考和寻找第二次创业的主题。后来选择了SSD,一方面当然是因为很有发展前景,还有一方面就是因为SSD的设计中会用到很多的算法,在你可以因为算法的优势而在竞争中胜出。&br&&/li&&/ul&这一点是初创公司相较于大公司或者先行者的很大的机会。我在这个回答&a href=&/question//answer/& class=&internal&&为什么在中国电子工程师的发展明显不如软件工程师方向? - 薛矽的回答&/a&下提过,半导体产业从目前的发展来看,是大者恒大、大者越来越大的游戏,那些动辄上亿美刀的研发和流片费用也不是start up玩的游戏。&br&不过在神经网络芯片这方面,算法占有相当重要的部分,那些巨头不一定有更好的解决方案。&br&关于这一点,前两天看到余凯的采访,里面也有类似的观点:&br&&blockquote&问:地平线的产品规划之一,是要做 AI Inside,做深度神经网络的芯片。但是芯片是一个巨额投入的产业,英伟达刚发布的Tesla P100 据说花了 20 亿美元研发。作为一个创业公司,地平线会怎么做芯片业务?&br&余凯:实际上现在的芯片设计和研发、制造,它的成本不一定是那么高。它关键要看采用的工艺是多少,如果工艺是 28 纳米或者更加高级的工艺,那会非常贵。但如果是 40 纳米,就不一定会那么贵。对于 NVIDIA 来说,他们的集成度是非常高的,所以研发费用会非常贵。但对于地平线来说,因为我们掌握算法,所以通过我们设计的算法,相对来说不需要那么高集成度的芯片,所以我们能把成本降下来。&/blockquote&&br&&br&&p&ps: 关于人工智能(神经网络)的发展史,前段时间和两位大咖前辈的交流让人十分感慨。&/p&&br&&p&一位是从NASA回来的Fellow,一次和他聊天讲到IBM的SyNAPSE,老师马上两眼放光:“我以前做的就是这个”。后来查了一下老师发表的论文,发现他90年毕业的博士论文题目就是neuroprocessors。现在也不做这方面的工作了。&br&还有一位是在当年PC时代第一次创业成功,当过NVIDIA 副总裁,现在回来做SSD二次创业的业界前辈,向他请教神经网络芯片相关的发展前景,他也说,“我读书的时候这个相当火热”。&/p&&p&我老板之前也说过,神经网络最冷的时候,paper中出现相关的字眼都有可能被拒掉。&/p&&br&&p&这些经历过人工智能第二次爆发以及后来的寒冬时期的前辈们所看到的和想到的可能会和我们不太相同。&/p&&br&&p&大牛&a data-hash=&be0d3bb133ad0151eefd188& href=&///people/be0d3bb133ad0151eefd188& class=&member_mention& data-editable=&true& data-title=&@田渊栋& data-hovercard=&p$b$be0d3bb133ad0151eefd188&&@田渊栋&/a& 一年前写的文章特别好,也特别值得一读:&a href=&/p/& class=&internal&&关于现在人工智能预测的一些冷水&/a&&/p&&p& 就引用其中的一段话来做结尾:&/p&&blockquote&科技发展的有趣之处在于,你永远无法知道,某一片枝叶会不会突变成为主干,某一曾起了极大作用的主干,会不会在将来十年内渐渐枯死不再发展。以前曾是通信领域支柱的信号处理,近年来其理论少有突破;而以前作为统计学枝叶的机器学习,现在则大行其道;而百年来几起几落的领域,也远远不止人工智能一家。&/blockquote&&p&这一波的人工智能浪潮最终将涌往何处,我们拭目以待。&/p&&br&&p&最近比较忙,就先写一些这段时间了解到的信息,之后再好好进行整理、完善和更新。&/p&&p&请勿转载。&/p&&p&感谢阅读,也请大家多多指正,万分感谢^_^&/p&&br&&ul&&li&推荐大家关注「机器之心」公众号XD (almosthuman2014)&/li&&/ul&
10/18更新 目前人工智能芯片领域的公司,知乎和网络上有一直有朋友们在询问。所以我们矽说大致做了一个整理(以已公开宣传的公司为主,一些低调的公司就没放入),供大家"按图索骥"地参考。 另外,如果大家在这张图里觉得有不合适的、不准确的、或是有遗漏…
工作11年,在京东的1年半时间里实现了职业的转型,能力的飞跃以及收获了一群志同道合的小伙伴,唯一让我不得不离开的原因是京东人资的条条框框~&br&来京东前在阿里做了3年多的sales,因为对产品经理这个岗位的向往所以决定转型,但在阿里,从sales直接转岗到PD的可能几乎没有(或者我孤陋寡闻),在历时半年多无数次申请失败后我直接在微博上把简历投给了京东研发部老大,并附上了我写的产品分析(现在看来写的很挫但当时起到了关键作用),于是得到了一个面试机会。通过临时抱佛脚的恶补和***+现场5轮面试后我得到了一个初级产品经理的岗位,也就是传说中的T1。在工作9年之际以30多岁的高龄拎包北上开始了北漂生涯,一切从0开始。(感觉跳过了龙门却也为后来的瓶颈埋下了伏笔)&br&到部门报到后第一件事是选产品方向,我的主管(硕士毕业两年的京东管培生)打开PPT给我介绍了部门当时在做的6,7个项目让我根据自己兴趣选,讲完之后我一个都没听懂但还是随手选了一个影响了我职业生涯的项目--JOS(京东开放服务)&br&JOS初期是做API的,但sales出身的我当时不知道什么是API,跟研发开会也是一句都听不懂,就这么稀里糊涂的开始“规划京东开放服务接口”,写第一篇文档的时候,3天没有憋出一个字~为了解决这个问题我采取了最原始的办法--录音,把每天的会议内容录下来,下班回家百度,一个名词一个名词研究,开始消化完一天的内容要到11,2点,后来9,10点,,这样过了半年也就是我转正3个月之后,拿到了部门当时唯一的晋升名额并开始负责JOS产品团队。--这是我对京东的第一个印象--敢于给人机会,让一个不知道什么是API的人做API产品经理这在当时的阿里是不可想象的~这种敢于用人的理念在我回到阿里后的百阿课程上得到了解释-“我们不看中你有多懂,而是你有多在乎”--这是马总当年对老陆说的话,可惜的是,当时作为一个普通sales的我,远远没有体会到阿里的这种理念,这些都是后话~&br&负责JOS产品线后感觉自己的进步突飞猛进,产品最重要的能力比如对业务的理解,沟通协调,跨团队合作等等都是做sales出身的人比较擅长的,一担跨过最初的产品门槛,进步就像打通任督二脉一样:),这里要再次感谢我当时的主管,没有让我这个“产品经理”画过一次原型,而是始终强调对业务的理解和规划能力~&br&负责产品团队半年后,部门架构进行了升级,而我也从产品团队负责人进一步晋升为JOS产品+运营的负责人,而这离我做sales的岁月才刚刚过去一年,想想真是唏嘘不已~&br&伴随着业务的突飞猛进,瓶颈也由此产生,由于入职起点低以及晋升制度的限制,在接近一年的时间里,我都是以一个T1的职级带领着一群T2,T3在战斗,大部分的团队成员收入要高出我一大截甚至个别2倍。当然,这个问题我的领导们也能看到,在13年的年终晋升上,准备一次破格给我提升3级,但即便如此,提升后的待遇还是受制度的制约无法达到我的要求也拿不到期权~此时也接到了老东家的offer,于是选择在晋升之前离开。
工作11年,在京东的1年半时间里实现了职业的转型,能力的飞跃以及收获了一群志同道合的小伙伴,唯一让我不得不离开的原因是京东人资的条条框框~ 来京东前在阿里做了3年多的sales,因为对产品经理这个岗位的向往所以决定转型,但在阿里,从sales直接转岗到PD…
我在自己的公众号里曾经写过相关的内容,就不搬运了,可以移步这里看:&br&&a href=&///?target=http%3A//mp./s%3F__biz%3DMzI3MTEwODc5Ng%3D%3D%26mid%3Didx%3D1%26sn%3Dddfdd7d8748f%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深度揭秘乱码问题背后的原因及解决方式&i class=&icon-external&&&/i&&/a&&br&和&br&&a href=&///?target=http%3A//mp./s%3F__biz%3DMzI3MTEwODc5Ng%3D%3D%26mid%3Didx%3D1%26sn%3D4d57fd15e309430cffd45ce39crd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GET请求传参乱码问题补充&i class=&icon-external&&&/i&&/a&&br&&br&总结起来就是,tomcat内部,可以通过URIEncoding的配置来解决GET请求的乱码问题,不过这个编码在Tomcat8时会默认设置成UTF-8。如果没设置URIEncoding而直接设置&br&useBodyEncodingForURI ,反而会直接导致GET请求容易有问题。&br&而通过filter设置的CharsetEncoding,对于GET的参数传递等并不能影响到。&br&&br&&b&对于POST的请求的乱码,需要注意页面内的contentType内的charset也会影响到。&/b&&br&有需要的朋友可以看上面提到的文章。如果有问题,随时交流。
我在自己的公众号里曾经写过相关的内容,就不搬运了,可以移步这里看:
总结起来就是,tomcat内部,可以通过URIEncoding的配置来解决GET请求的乱码问题,不过这个编码在Tomcat8时会默认设…
早就不是了。我知道的公司里大量使用C++之外的语言的:&br&&br&卖方:&br&&br&高盛:Slang/SecDB。Slang全称是Securities Language(你也猜到了,SecDB就是Securities Database),是高盛的 Proprietary Language,从九十年代初开发至今,是一个庞大的系统,主要用C++写成,代码行数上亿,质量就不予置评了。大多数的交易组(刨去几个电子做市组,对延迟要求太严格)的证券定价和策略执行都是使用 Slang。当然,有一些组也开始了去 Slang 化的努力,跟积重难返的技术债有关,这里就不多说了。&br&&br&摩根斯坦利:Scala。当然,大摩供着 C++ 之父,肯定不会浪费这块宝贝,不过就我所知他们的衍生品定价很多都是用 Scala 做的。&br&&br&摩根大通:Java。另外高盛 Slang 的前开发头头 Alexander Davidovich 去了小摩,据说在开发进化版 Slang,也不知道真假。&br&&br&买方:&br&&br&Teza Technologies:Java。城堡高频组前老大 Misha 出走创办的高频公司,现在已经是业界顶尖,他们的执行代码是 Java。&br&&br&Headlands Technologies:Java。Headlands 跟 Teza 系出同门,几位合伙人之前也都是城堡的高管。作为纯正的高频公司,他们的 JVM 也优化得出神入化,性能不输C++。另外他们有很好的策略研发系统,是用Python 写的。唯一可惜的一点是他们没有 Teza 赚钱。。。&br&&br&HBK Investments(德州/纽约的一家 $10B 左右的对冲基金,统计套利团队很不错):C#(是的你没看错)。&br&&br&这个表单还很长,不过各举三家就大概能表达我的意思了。对于卖方的大公司来说,方便合作开发是最重要的,无论是 Java 也好,专为证券交易设计的自有语言也好,都很好达成了这个目标;而对于买方初创不久的小团队来说,选择团队技术领袖最擅长的语言才是最划算的。&br&&br&注意,以上如未特殊说明,都指的是公司的定价和交易系统所使用语言。研究和测试策略这种任务的话,就是 R Python Haskell OCaML Julia Go Matlab 往上一气招呼,Quant 们喜欢用啥就用啥,没什么限制(上面提到的 Headlands 这种花大力气搭了研究基础设施的除外)。
早就不是了。我知道的公司里大量使用C++之外的语言的: 卖方: 高盛:Slang/SecDB。Slang全称是Securities Language(你也猜到了,SecDB就是Securities Database),是高盛的 Proprietary Language,从九十年代初开发至今,是一个庞大的系统,主要用C++写成…
&p&首破1K 留念&/p&&p&===============&/p&&br&&p&有人嫌我回答的太专业,我用通俗的语言说下:&/p&&p&1.海思芯片类设计可认为是国内最高端的水平。&/p&&p&2.海思研发的手机类芯片真心不是海思的最高水平,海思的最高水平可参考高端400G路由器,领先对手半年推出产品,靠的就是海思比别人先研发出自己的芯片。&/p&&p&3.从通讯类芯片的水平来看,海思可以说做到世界前三。&/p&&p&4.海思从过去做芯片依靠Altera,IBM,TI到现在自己布线,可以说进步是非常大的。&/p&&p&5.海思从买别人的IP Core到修改,到自己设计IP Core,也是国内所少有的。&/p&&p&6.关于自主研发的问题,我在说一次,我们写本书,没必要再把造纸术和汉字都发明一遍。&/p&&p&7.我们用英文写论文看的是你论文的水平,不会有人说因为你用英文写的而没有发明汉字而认为你的论文是抄袭的。&/p&&p&放眼世界,NP(网络处理器)这种复杂的芯片,从来没有见过敢拿盲片(刚生产出来,未经测试的芯片)给人家用,说我们这个是好的,你放心用吧。海思敢有这样的信心!!!&/p&&br&&p&在普及芯片的相关知识,这部分不好找。我们以造汽车为例子。&/p&&p&当我们设计好了汽车的图纸,送到工厂,工厂按照图纸,装配图为装配好了一辆汽车,但是工厂并不管你汽车能不能用。这时候叫给你手里的就是&b&盲片&/b&&/p&&br&&p&当设计者拿到汽车后,开始在测试轮子是否转,转向是否好使,刹车是否灵敏,比如工厂做了10辆车给你,可能8辆是坏的,有的不能转弯,有的没有刹车。经过设计者筛选。这时候是&b&T10片&/b&&/p&&br&&p&然后设计者就告诉工厂,你下次给我汽车的时候,你要测试好轮子是否能转,转向是否好使,刹车是否好用,如果不好用,都是加工失败,这种次品(良率) 不要给我们了。这时候就是&b&A10片&/b&&/p&&br&&p&当汽车大批量买出去了,然后发现,每1000台里面有1台会出现 断轴,这时候,又要工厂在出厂前增加测试,是否会短轴,这时候才是&b&正式的商用芯片&/b&&/p&&br&&p&我们一般买能买到的都是正式的商用芯片,而海思给自己人调试的时候用的是盲片。当产品正式发布的时候,海思也开始供应正式的商用芯片。&/p&&br&&p&另:修正错别字&/p&&p&更于下班到酒店&/p&&p&-------------------------------&/p&&p&还没回答,就有一赞,情何以堪啊。&/p&&p&我先简单用手机答下,免得使用公司网络被查。&/p&&p&请忽略我所在的公司,***仅代表个人观点,与公司无关。&/p&&br&&p&本人因工作原因,频繁使用海思芯片。总体感受又恨又爱。&/p&&p&好多人说海思的手机CPU,这个我不了解,请参考他们的。我来说说NP芯片。华为的路由器使用不少自己的芯片,总的来说有SA类,SD类,HI类,不具体说明,涉及信息安全。&/p&&p&SA类一般做降成本的,比如某电源产品,做DCDC,还可以做电压传感器,还可以GPIO,结果按手册做了,回板以后发现IIC驱动能力不足。电压传感器不能使用,GPIO不能使用,怎么办,我们不能等他们改完发布我们的产品,于是改版,做兼容方案,等海思搞定以后,要去掉商业芯片,重做料单。(&b&恨啊&/b&)&/p&&p&--------------又开始忙了-------先更新到这-----------------&/p&&p&终于周六了,不用按点上班了,但是也是要去的。&/p&&p&接着说海思Hi系列的芯片。&/p&&p&
前几天听海思的讲座说Hi系列的后面要可以卖给非华为的公司做设计,目前看到的是几款CPU,说到CPU毕竟现在只有华为一家使用,刚设计好Arm_A9的,然后呢下一代CPU就要Arm_A15的,海思又重新设计,通用性不是很好,不像其他公司,一个arm核可以出一系列的芯片,华为这边一个arm核就出那么几个芯片,也难为海思了,海思一直挺辛苦的。产品也累,一个产品持续用海思的芯片,你要装a9的交叉编译,又要装a15的交叉编译,过半个月告诉你,a15的要升级编译器,a9的不要升级。。。 &b&(恨啊)&/b&&/p&&br&&p&
在说SD系类的芯片,尤其是 NP 网络处理器的芯片,说实在的,其实就是多核CPU,外围加上一些数据通路,作为转发报文的专用处理器。&/p&&p&SD系列是完全自家用,不卖别人的,我觉得也是代表了华为的最高水平,第一代NP的设计,如果有做硬件的可能清楚,其实就写了verilog,在FPGA中验证,功能OK以后,送到台积电去做流片。&/p&&p&布线啥的,由我们出人检视。这样其实也算是中国芯吧,还不能说是完全自主设计。最新一代海思的芯片给我们的宣传时,从verilog到布线全都是我们自己做,台积电只拿过来门电路的库,然后自己布线自己搭。这时候说CPU是中国设计我觉得不过份,至少从我看来,能做到这一点,&b&可以说是中国企业在芯片领域的最高端了吧。 &/b&没有求证过,从最开始买人家的core,开始逐渐设计自己的core,是我真心敬佩的。&/p&&br&&p&
说到又恨又爱,我们说说对海思的爱,海思的优势在什么地方。海思打破了国外的芯片厂家对我们的垄断和制约。可以让我们的产品更快的推出市场。可以说叫深度合作,或者伴随式开发。&/p&&p&我下面说说开发模式。&/p&&p&
海思的芯片开发,要有产品这边出钱,也就是说,类似产品定制化的服务,不只定义功能,包括走线,管教的pinmap都可以自己来定制。这个后面极大的降低了pcb走线层数和pcb成本,某款海量发货的单板,用商业套片的时候,我没记错应该是12到16层。一系列的板子,当这些板子替换了海思芯片以后,统一降到了4~6层,做硬件的估计开始欢呼了吧.就是这个样子。&/p&&p&
那产品定制还有个好处,同时立项,硬件这边设计方案的时候,海思开始设计芯片,硬件这边在完成原理图的时候,海思芯片投出去。大家如果了解做芯片的可能知道盲片这个说法,也就是PCB回来以后,盲片也回来了,听说有产品直接在盲片验证,这是多么大的信心啊。迫于交付进度,我们最近也再考虑是否用盲片验证,按照计划是,盲片回片一周后给出T10片给硬件做验证。这样,如果海思的水平和博通一样,那么对于产品来说,会比其他公司的至少提前推出半年以上。&/p&&p&
如果调试的时候有问题,商业芯片,不少同事觉得博通的FAE简直是大爷,我遇到的还好。至少海思的完全不敢,一般用海思芯片的板子,要不都是战略级产品,要不都是海量发货的,产品线总裁都是高度关注,下面海思支持稍有不利的,一旦报上去,产品线总裁就会压海思的总裁,结果海思的员工的辛苦不言而喻。对于产品来说,却压力小了。&/p&&br&&p&题目问海思的水平,说了这么多,大概有所了解了,我们拿最新刚回片,我参与的一个项目的开发为例。此芯片本5号(上周)回的盲片,在验证板上3个小时内打通业务,晚上作战部队集体出去吃饭High去了,给我们发的喜报,预计15号左右给出T10的芯片给我们调试。&/p&&br&&p&海思的进步是所有人有目共睹的,包括很多人说到海思的手机CPU,我想说的是,海思还很年轻,做到这些已经很不容易了,请多给海思一些包容,一些肯定,一些时间,海思必将是华为和中国的骄傲。虽然我不是海思的人。&/p&&br&&p&------------------------------------------------(完)&/p&&p&多说一句,感谢大家为我点赞。你们点赞以后,我感觉压力好大,天天想着啥时候把后面的更上去。谢谢大家。&/p&
首破1K 留念=============== 有人嫌我回答的太专业,我用通俗的语言说下:1.海思芯片类设计可认为是国内最高端的水平。2.海思研发的手机类芯片真心不是海思的最高水平,海思的最高水平可参考高端400G路由器,领先对手半年推出产品,靠的就是海思比别人先研…
已有帐号?
无法登录?
社交帐号登录
10124 人关注
228 条内容
1949 人关注
202 条内容
19156 人关注
436 条内容

参考资料

 

随机推荐