专栏名称: Cocoa开发者社区
CocoaChina苹果开发中文社区官方微信,提供教程资源、app推广营销、招聘、外包及培训信息、各类沙龙交流活动以及更多开发者服务。
目录
相关文章推荐
51好读  ›  专栏  ›  Cocoa开发者社区

用 Tab 还是 Space?谷歌程序员分析了10亿份代码

Cocoa开发者社区  · 公众号  · ios  · 2016-09-06 08:05

正文

▲点击上方“CocoaChina”关注即可免费学习iOS开发


本文由伯乐在线 - 小米云豆粥 翻译

黄利民 校稿

链接:http://blog.jobbole.com/105381/

英文出处:Felipe Hoffa


用 Tab 还是 Space?事关程序员的信仰之争。2015 年程序员 Uku Pattak 分析了 GitHub 上多种语言的热门项目(star 数量高)中使用 Tab 和空格的对比情况。2016 年,谷歌程序员 Felipe Hoffa 分析了 10 亿份代码。


分析结果可先看下图:



40万个repo, 10亿份代码文件, 14TB 代码


规则:

  • 数据来源:已存储在 BigQuery 上的 GIthub 文档

  • Star 很重要:只选择了2016年1月到5月之间加星量(star)在前 40 万个的项目

  • 排除小文件:代码文件至少得有 10 行代码,开始的字符是:空格或者制表符

  • 去除冗余:不管它们存在于多少个项目中,相同的程序文件只算一次

  • 一个文件一票:有些代码文件中混用了制表符和空格。如果该文件制表符用的多,那它就算制表符一票。反之亦然。

  • 只考虑使用广泛的编程语言:我只选取了有下面这些后缀的文件:(.java, .h, .js, .c, .php, .html, .cs, .json, .py, .cpp, .xml, .rb, .cc, .go)


数据



实现方法


我使用了已有的 [bigquery-public-data:github_repos.sample_files] 表。这个表列出了排名最前的 40 万个项目。从中提取了含有被广泛使用的语言后缀的文件。


SELECT a.id id, size, content, binary, copies, sample_repo_name , sample_path

FROM (

SELECT id, FIRST(path) sample_path, FIRST(repo_name) sample_repo_name

FROM [bigquery-public-data:github_repos.sample_files]

WHERE REGEXP_EXTRACT(path, r'.([^.]*)$') IN ('java','h','js','c','php','html','cs','json','py','cpp','xml','rb','cc','go')

GROUP BY id

) a

JOIN [bigquery-public-data:github_repos.contents] b

ON a.id=b.id


864.6s elapsed, 1.60 TB processed


由于我要联结分别有 1.97 亿行和 0.7 亿行的两个表(一共有 1.6T 数据量),这个过程花费了不少时间。我把结果放在这里了[fh-bigquery:github_extracts.contents_top_repos_top_langs],你们就不用重新跑这个过程了。


在 [contents] 表格中,包含了去冗余之后的所有文件。下面的命令行用来检查文件数量和大小。


SELECT SUM(copies) total_files, SUM(copies*size) total_size

FROM [fh-bigquery:github_extracts.contents_top_repos_to


10 亿文件,14TB代码


然后开始按照前面提到的规则排序:


SELECT ext, tabs, spaces, countext, LOG((spaces+1)/(tabs+1)) lratio

FROM (

SELECT REGEXP_EXTRACT(sample_path, r'.([^.]*)$') ext,

SUM(best='tab') tabs, SUM(best='space') spaces,

COUNT(*) countext

FROM (

SELECT sample_path, sample_repo_name, IF(SUM(line=' ')>SUM(line='t'), 'space', 'tab') WITHIN RECORD best,

COUNT(line) WITHIN RECORD c

FROM (

SELECT LEFT(SPLIT(content, 'n'), 1) line, sample_path, sample_repo_name

FROM [fh-bigquery:github_extracts.contents_top_repos_top_langs]

HAVING REGEXP_MATCH(line, r'[ t]')

)

HAVING c>10 # at least 10 lines that start with space or tab

)

GROUP BY ext

)

ORDER BY countext DESC

LIMIT 100


16.0s elapsed, 133 GB processed


分析 133G 代码只有 16 秒?我爱 BigQuery。



小编推荐:[掘金]是一个高质量的技术社区,从 Swift 到 React Native,性能优化到动效源码,让你不错过 iOS 开发的每一个技术干货。长按图片二维码识别或者各大应用市场搜索「掘金」,技术干货尽在掌握中。



微信号:CocoaChinabbs


▲长按二维码“识别”关注即可免费学习 iOS 开发

月薪十万、出任CEO、赢娶白富美、走上人生巅峰不是梦

--------------------------------------

商务合作QQ:2408167315

投稿邮箱:[email protected]