> 一份2021年03月18日的信息流提炼 ### 每天学点Golang ### Golang性能 | Go RESTful API的基准测试 原文:newline: Golang Performance: Benchmarking a Go RESTful API Go的性能很好,但是代码实现也有非常大的影响。 基准(Benchmarks)简述 基准测试是一种测试技术,它可以帮助你回答一些问题,如: - "我的代码运行速度如何? - "而如果我对我的代码进行这些修改,是否会得到显著的性能提升?" Benchmarks为我们提供了量化代码性能的实际数字。 - 执行时间--运行需要多少时间? - 总内存分配量--必须分配多少内存才能运行? - 内存分配率--必须分配多少次内存才能满足总内存需求? ##### 一个简单的基准测试示例 ```go // Returns the sum of two ints func Sum(a int, b int) { // Add the two input numbers // return their sum return a + b } ``` ```go // Import testing library import ( "testing" ) // Benchmark for `Sum` function func BenchmarkSumFunc(b *testing.B) { // Run the function `b.N` times for i := 0; i < b.N; i++ { Sum(100, i) } } ``` 测试: `go test -bench=. ` 结果: ![fWKBev1yaFYz7Zd](https://i.loli.net/2021/03/18/fWKBev1yaFYz7Zd.jpg) 这个基准在b.N次迭代中运行Sum函数。在本例中,该基准运行了10亿次迭代。平均而言,每次迭代运行0.6199 ns。 ##### RESTful API基准测试例子 [newline-sandbox/go-chi-restful-api](https://github.com/newline-sandbox/go-chi-restful-api) - GET /posts - 检索一个帖子列表。 - POST /posts - 创建一个帖子。 - GET /posts/{id} - 按id检索帖子。 - PUT /posts/{id} - 根据id更新帖子。 - DELETE /posts/{id} - 通过id删除一个帖子。 ```bash # 安装依赖关系 make install_deps # 执行 routes/posts_test.go 文件中的单元测试。 make test ``` outes/posts_test.go 基准测试 ```go // routes/posts_test.go // ... func BenchmarkGetPostsHandler( b *testing.B) { // Group benchmarks b.Run( "Endpoint: GET /posts", func(b *testing.B) { GetPosts = ( &JsonPlaceholderMock{}).GetPosts // Define the GET request // to benchmark r, _ := http.NewRequest( "GET", "/posts", nil) // Create a response recorder w := httptest.NewRecorder() // Create an HTTP route handler handler := http.HandlerFunc( PostsResource{}.List) // Turn on memory stats b.ReportAllocs() b.ResetTimer() // Execute the handler // with a request, `b.N` times for i := 0; i < b.N; i++ { handler.ServeHTTP(w, r) } }) } ``` 在上面的代码中,我们使用b.Run按照测试的功能对基准进行分组。为了避免在基准测试过程中发送网络请求,我们模拟了GetPosts包的范围变量。我们创建一个新的GET请求,通过http包的NewRequest方法发送到/posts。 我们还通过httptest.NewRecorder创建了一个响应记录器来记录ResponseWriter的突变。PostsResource{}.List方法是一个普通函数。因此,我们将它传递给http包的HandlerFunc方法,从中创建一个http路由处理程序。 我们通过b.ReportAllocs开启malloc统计功能,在输出中额外显示两列。这两列告诉我们平均每次迭代分配了多少字节的内存,以及每次迭代执行了多少次分配。 handler.ServeHTTP方法使用响应记录器w和创建的请求r来执行 PostsResource{}.List的HTTP路由处理程序表示。 我们在 handler.ServeHTTP 上循环,直到基准确定它的运行速度。b.N的值会发生变化,直到基准稳定下来并知道它必须运行多长时间才能正确地对函数进行计时。 ##### 运行基准测试 ```bash go test -bench=. ./routes -run=^$ ``` - `-bench=.` - 告诉 go test 在项目的 _test.go 文件中运行基准和测试。.是一个正则表达式,告诉go test要与一切匹配。 - `./routes` - 告诉 go test 在 _test.go 文件中运行基准和测试的位置。 - `-run=^$` - 告诉 go test 运行名称满足正则表达式 `^$` 的测试。由于所有测试的名字都不是以 `$` 开头,所以 go test 不运行任何测试,只运行基准。 ![phDNZyXmuJwxbGz](https://i.loli.net/2021/03/18/phDNZyXmuJwxbGz.jpg) 基准总共运行了97220次迭代,每次迭代平均运行11439ns。这代表了每个 handler.ServeHTTP 函数和 PostsResource{}.List 调用完成的平均时间。每次迭代平均涉及分配33299字节的内存。平均每次迭代分配内存8次。 像这样的基准特别有用的是,我们能够对程序的不同实现进行编码,看看哪种实现表现最好。开源码项目经常这样做,项目的主要升级包括新的实现,为基本任务提供一套更有效的例程。 ### 每天学点Linux #### 5个超级方便的Linux命令 原文:[5 Super Handy Linux Commands that Everyone Should be Aware of](https://levelup.gitconnected.com/5-super-handy-linux-commands-that-everyone-should-be-aware-of-a70b08d2c635) ```bash # Killall exactly matches the argument name by default and kills the matching process. Here is how to use it # -I option to ignore the case. killall -I notes # edit long command Ctrl + x + e # tee vs. >> : 除了写到文件外,tee还将数据复制到STDOUT。 echo 123 | tee test.txt # edit last command fc ``` ### 每天学点marketing #### Google Analytics 使用自定义URL收集活动数据 原文:[Collect campaign data with custom URLs](https://support.google.com/analytics/answer/1033863?hl=en) 通过向您在广告活动中使用的目标 URL 添加活动参数,您可以收集有关这些活动的整体功效的信息,还可以了解活动在哪些方面更有效。 - utm_source。识别广告商,网站,出版物等,是发送流量元,例如:谷歌,通讯4,广告牌。 - utm_medium: 广告或营销媒体,例如:CPC,横幅,电子邮件通讯。 - utm_campaign: 产品的单个活动名称、口号、促销代码等。 - utm_term。识别付费搜索关键词。如果你是手动标记付费关键词活动,也应该使用utm_term来指定关键词。 - utm_content。用于区分相似的内容,或同一广告中的链接。例如,如果您在同一封电子邮件内有两个呼叫行动链接,您可以使用utm_content并为每个链接设置不同的值,以便您可以判断哪个版本更有效。 ##### URL生成 - 网站链接: 使用 Google Analytics Demos & Tools 网站上的 [Campaign URL Builder](https://ga-dev-tools.appspot.com/campaign-url-builder/) - Android应用程序: 使用 [Google Play URL Builder](https://developers.google.com/analytics/devguides/collection/android/campaigns#google-play-url-builder)。您还必须在 SDK 中设置 Google Play Campaign Attribution。如果您在初始设置期间没有完成此功能,请使用我们的《开发者指南》了解如何在您的 Android SDK 中实施 Google Play Attribution。 - iOS-应用广告。使用 [iOS Campaign Tracking URL Builder](https://developers.google.com/analytics/devguides/collection/ios/v3/campaigns#ios-url-builder)。 ##### 查看自定义数据 登录到谷歌分析。 进入到视图。 打开[Reports](https://support.google.com/analytics/answer/6102416)。 选择 **Acquisition > Campaigns**。 ### 其他值得阅读 - Focalboard:开源自托管的项目管理系统。 [Focalboard: Open source, self-hosted project management](https://www.reddit.com/r/selfhosted/comments/m72mes/focalboard_open_source_selfhosted_project/) - 我做了30多个项目,使用React / Nextjs作为前端和各种栈作为后端: [I made 30+ project using React / Nextjs as frontend and various stacks as a Backend(MongoDB,Nodejs,Express,Firebase,Airtable,Prisma...). Please feel free to check em out.](https://www.reddit.com/r/reactjs/comments/m6vo0r/i_made_30_project_using_react_nextjs_as_frontend/)