当前位置: 首页 > news >正文

珠海网站制作网络公司汽车租赁网站设计

珠海网站制作网络公司,汽车租赁网站设计,展厅设计要考虑哪些方面,微博个人网页设计模板logo对于许多 golang 开发者来说#xff0c;考虑到性能#xff0c;最佳实践是系统地使用指针而非结构体副本。我们将回顾两个用例#xff0c;来理解使用指针而非结构体副本的影响。1. 数据分配密集型让我们举一个简单的例子#xff0c;说明何时要为使用值而共享结构体…logo对于许多 golang 开发者来说考虑到性能最佳实践是系统地使用指针而非结构体副本。我们将回顾两个用例来理解使用指针而非结构体副本的影响。1. 数据分配密集型让我们举一个简单的例子说明何时要为使用值而共享结构体type S struct { a, b, c int64 d, e, f string g, h, i float64}这是一个可以由副本或指针共享的基本结构体func byCopy() S { return S{ a: 1, b: 1, c: 1, e: foo, f: foo, g: 1.0, h: 1.0, i: 1.0, }}func byPointer() *S { return S{ a: 1, b: 1, c: 1, e: foo, f: foo, g: 1.0, h: 1.0, i: 1.0, }}基于这两种方法我们现在可以编写两个基准测试其中一个是通过副本传递结构体的func BenchmarkMemoryStack(b *testing.B) { var s S f, err : os.Create(stack.out) if err ! nil { panic(err) } defer f.Close() err trace.Start(f) if err ! nil { panic(err) } for i : 0; i b.N; i { s byCopy() } trace.Stop() b.StopTimer() _ fmt.Sprintf(%v, s.a)}另一个非常相似它通过指针传递func BenchmarkMemoryHeap(b *testing.B) { var s *S f, err : os.Create(heap.out) if err ! nil { panic(err) } defer f.Close() err trace.Start(f) if err ! nil { panic(err) } for i : 0; i b.N; i { s byPointer() } trace.Stop() b.StopTimer() _ fmt.Sprintf(%v, s.a)}让我们运行基准测试go test ./... -benchBenchmarkMemoryHeap -benchmem -run^$ -count10 head.txt benchstat head.txtgo test ./... -benchBenchmarkMemoryStack -benchmem -run^$ -count10 stack.txt benchstat stack.txt以下是统计数据name time/opMemoryHeap-4 75.0ns ± 5%name alloc/opMemoryHeap-4 96.0B ± 0%name allocs/opMemoryHeap-4 1.00 ± 0%------------------name time/opMemoryStack-4 8.93ns ± 4%name alloc/opMemoryStack-4 0.00Bname allocs/opMemoryStack-4 0.00在这里使用结构体副本比指针快 8 倍。为了理解原因让我们看看追踪生成的图表第一张图非常简单。由于没有使用堆因此没有垃圾收集器也没有额外的 goroutine。对于第二张图使用指针迫使 go 编译器将变量逃逸到堆[1]由此增大了垃圾回收器的压力。如果我们放大图表我们可以看到垃圾回收器占据了进程的重要部分。在这张图中我们可以看到垃圾回收器每隔 4ms 必须工作一次。如果我们再次缩放我们可以详细了解正在发生的事情蓝色粉色和红色是垃圾收集器的不同阶段而棕色的是与堆上的分配相关(在图上标有 “runtime.bgsweep”)清扫是指回收与堆内存中未标记为使用中的值相关联的内存。当应用程序 Goroutines尝试在堆内存中分配新值时会触发此活动。清扫的延迟被添加到在堆内存中执行分配的成本中并且与垃圾收集相关的任何延迟没有关系。Go 中的垃圾回收第一部分 - 基础[2]即使这个例子有点极端我们也可以看到与栈相比在堆上为变量分配内存是多么消耗资源。在我们的示例中与在堆上分配内存并共享指针相比代码在栈上分配结构体并复制副本要快得多。如果你不熟悉堆栈或堆如果你想更多地了解栈或堆的内部细节你可以在网上找到很多资源比如 Paul Gribble 的这篇文章[3]。如果我们使用 GOMAXPROCS 1 将处理器限制为 1情况会更糟name time/opMemoryHeap 114ns ± 4%name alloc/opMemoryHeap 96.0B ± 0%name allocs/opMemoryHeap 1.00 ± 0%------------------name time/opMemoryStack 8.77ns ± 5%name alloc/opMemoryStack 0.00Bname allocs/opMemoryStack 0.00如果栈上分配的基准数据不变则堆上的基准从 75ns/op 降低到 114ns/op。2.方法调用密集型对于第二个用例我们将在结构体中添加两个空方法稍微调整一下我们的基准测试func (s S) stack(s1 S) {}func (s *S) heap(s1 *S) {}在栈上分配的基准测试将创建一个结构体并通过复制副本传递它func BenchmarkMemoryStack(b *testing.B) { var s S var s1 S s byCopy() s1 byCopy() for i : 0; i b.N; i { for i : 0; i 1000000; i { s.stack(s1) } }}堆的基准测试将通过指针传递结构体func BenchmarkMemoryHeap(b *testing.B) { var s *S var s1 *S s byPointer() s1 byPointer() for i : 0; i b.N; i { for i : 0; i 1000000; i { s.heap(s1) } }}正如预期的那样结果现在大不相同name time/opMemoryHeap-4 301µs ± 4%name alloc/opMemoryHeap-4 0.00Bname allocs/opMemoryHeap-4 0.00------------------name time/opMemoryStack-4 595µs ± 2%name alloc/opMemoryStack-4 0.00Bname allocs/opMemoryStack-4 0.00结论在 go 中使用指针而不是结构体的副本并不总是好事。为了能为你的数据选择好的语义我强烈建议您阅读 Bill Kennedy[4] 撰写的关于值/指针语义的文章[5]。它将为你提供更好的视角来决定使用自定义类型或内置类型时的策略。此外内存使用情况分析肯定会帮助你弄清楚你的内存分配和堆上发生了什么。
http://www.yutouwan.com/news/273893/

相关文章:

  • 公司网站设计意见网站seo资讯
  • 北京网站推广优化网站推广的10种方法
  • 福田网站建设运营费用刚做网站和搜出来的不一样
  • 分类信息网站营销苏州小程序开发设计公司
  • 童装东莞网站建设技术支持黄岛建设局网站
  • 网站建设 pdf企业产品微网站收费吗
  • 网站怎么做数据库个人免费开店的网站
  • 东营网站建设专业定制网站统计模板
  • 网站建设与制作教程下载上海网络营销外包服务公司
  • 石家庄网站建设模板浙江建设网站是多少
  • 珠海左右创意园网站开发网站开发案例代码
  • 泰安网站seo推广有人模仿qq音乐做的h5网站吗
  • 广告联盟做网站联盟文明网站建设有新突破
  • 应税服务网站开发开票连云港企业建站 网站
  • 辽宁网站备案要多久360建站工具
  • 高唐网站建设简洁物流网站模板
  • 建设一个网站的基本步骤域名更换网站
  • 通用网址通用网站查询网站设计介绍怎么写
  • 深圳营销型网站建设公司选择哪家好php是做网站美工的吗
  • 360免费建站模板俄罗斯做电商网站
  • 网站模版 源码网页制作与网站建设初学者必看教程
  • 西安做网站公司怎么样pc网站建设和推广
  • 品牌网站建设哪好设计师网页设计
  • 建设公司网站需要多少钱1sose wordpress
  • 山东省住房城乡建设厅网站那个网站做h5不要钱
  • 做网站怎么对接国际收款商户网站上如何做电子手册
  • 国外建筑设计网站推荐外贸人常用的网站
  • 专业网站搭建运营网站开发什么语言
  • asp.net网站开发简介开发小程序用什么软件写代码
  • 12306铁路网站开发语言合肥网页设计工资一般多少