一个博文引起代码优化的思路

package generateString

import(
    "time"
    "testing"
    "math/rand"
)

var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
const letterBtyes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const letterIdxBits = 6
const letterIdxMask = 1 << letterIdxBits -1
const letterIdxMax = 63 /letterIdxBits
var src = rand.NewSource(time.Now().UnixNano())

func init(){
    rand.Seed(time.Now().UnixNano())
}

// 常见做法
func RandStringRunes(n int) string {
    b := make([]rune,n)
    for i:= range b{
        b[i] = letterRunes[rand.Intn(len(letterRunes))]
    }
    return string(b)
}

// bytes改进
func RandStringByte(n int) string{
    b := make([]byte,n)
    for i := range b{
        b[i] = letterBtyes[rand.Intn(len(letterBtyes))]
    }
    return string(b)
}

// 余数改进
func RandStringByteRmndr(n int)string{
    b := make([]byte,n)
    for i:= range b{
        b[i] = letterBtyes[rand.Int63()%int64(len(letterBtyes))]
    }
    return string(b)
}

// 掩码
func RandStringByteMask(n int)string{
    b := make([]byte,n)
    for i:=0;i<n;{
        // & 按位与
        if idx := int(rand.Int63()&letterIdxMask);idx < len(letterBtyes){
            b[i] = letterBtyes[idx]
            i++
        }
    }
    return string(b)
}

// 掩码改进,保证公平性的利用资源
func RandStringByteMaskImpr(n int)string{
    b := make([]byte,n)
    for i,cache,remain := n-1,src.Int63(),letterIdxMax;i>=0;{
        if remain==0{
            cache,remain = src.Int63(),letterIdxMax
        }
        if idx := int(cache & letterIdxMask);idx < len(letterBtyes) {
            b[i] = letterBtyes[idx]
            i--
        }
        cache >>= letterIdxBits  //可以移动十次
        remain--  //修改十次
    }
    return string(b)
}

func BenchmarkRandStringRunes(b *testing.B){
    for i:=0;i<b.N;i++{
        RandStringRunes(5)
    }
}

func BenchmarkRandStringBytes(b *testing.B){
    for i:=0;i<b.N;i++{
        RandStringByte(5)
    }
}

func BenchmarkRandStringByteRmndr(b *testing.B){
    for i:=0;i<b.N;i++{
        RandStringByteRmndr(5)
    }
}

func BenchmarkRandStringByteMask(b *testing.B){
    for i:=0;i<b.N;i++{
        RandStringByteMask(5)
    }
}

// 这部分缩短的时间太多了吧
func BenchmarkRandStringByteMaskTmpr(b *testing.B){
    for i:=0;i<b.N;i++{
        RandStringByteMaskImpr(5)
    }
}
  • 输出结果
goos: windows
goarch: amd64
BenchmarkRandStringRunes-8               5756960               219 ns/op              40 B/op          2 allocs/op
BenchmarkRandStringBytes-8               8533357               146 ns/op              10 B/op          2 allocs/op
BenchmarkRandStringByteRmndr-8           9865086               125 ns/op              10 B/op          2 allocs/op
BenchmarkRandStringByteMask-8            8979186               141 ns/op              10 B/op          2 allocs/op
BenchmarkRandStringByteMaskTmpr-8       20043025                61.9 ns/op            10 B/op          2 allocs/op
PASS
ok      command-line-arguments  7.266s
  • 优化代码的思路

    • 要拥有的工具:学会使用go test中性能测试
    • 通过使用性能测试工具,找到耗时的地方
    • 内存资源尽可能多的利用

原文地址:https://www.cnblogs.com/MyUniverse/p/11638470.html

时间: 2024-11-14 12:36:10

一个博文引起代码优化的思路的相关文章

手动实现一个vue的mvvm,思路解析

1.解析dom.fragment编译,初始化new watcher 2 ,数据劫持,Object.defineProperty(obj,key,{ configurable:true,// 可以配置 enumerable:true, // 可以枚举 get:function(){return value}, // 添加wacher,添加订阅者 set:function(newValue){ return newValue}  // noticfy:执行,更新数据 }) 3, 发布订阅模式: 什么

基础的多级菜单一个没见过的思路

主要代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> <title>jQuery多级菜单-jq22.com</title> <script src="https://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script> <style> &l

【LeetCode】下一个排列与全排列问题

(一)下一个排列 题目(Medium):31. 下一个排列 题目描述: ??实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. ??如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). ??必须原地修改,只允许使用额外常数空间. ??以下是一些例子,输入位于左侧列,其相应输出位于右侧列. ??1,2,3 → 1,3,2 ??3,2,1 → 1,2,3 ??1,1,5 → 1,5,1 解题思路: ??本题有一个比较固定的算法思路,可以总结为以下

关于Spring JDBC RowMapper的一点改进思路

[注]通常我们使用RowMapper(比如ParameterizedRowMapper),都需要定义好查询字段,如果使用别名就没办法了.还要比如加入group,或者联合查询,也不能够使用,除非不想要非主体Bean之外的字段,那么只能用Map接收返回结果了,或者直接实现RowMapper.基于这一点,提出一个稍微通用的解决思路:所有的Bean都继承一个基类Bean,里面放一个Map(就是存放那些Bean没有指定的字段了,比如sum.count.avg - 各种查询字段或者别名),参考BeanPro

多个jsp页面共享一个js对象的超级方法

一个jsp页面为A.jsp,在A.jsp中点击一个按钮打开另一个B.jsp页面.思路如下: 在A.jsp打开B.jsp的事件中,写入如下代码: 1 2 window.top['_CACHE'] = chatFrdList; window.top['_CACHE'][frdUserId] = frdUserId; 其中,chatFrdList定义为var chatFrdList = new Object(); frdUserId为一个用户的id. 那么,在B.jsp的一个事件中,就可以执行下面的操

仅使用处理单个数字的I/O例程,编写一个过程以输出任意实数(可以是负的)。

题目取自:<数据结构与算法分析:C语言描述_原书第二版>——Mark Allen Weiss   练习1.3 如题. 补充说明:假设仅有的I/O例程只处理单个数字并将其输出到终端,我们将这个例程命名为PrintDigit:例如"PrintDigit(4)" 将输出一个"4"到终端. 思路:根据先简后繁的原则,程序各版本完成的功能依次为:处理正整数—>处理所有整数—>处理double—>double舍入. 版本一: // 正整数版(更大的

判断一个二叉树是否是平衡二叉树

题目:判断一个二叉排序树是否是平衡二叉树 思路:利用递归判断左右子树的深度是否相差1来判断是否是平衡二叉树. 1 #include<stdio.h> 2 #include "stdafx.h" 3 4 struct BinaryTreeNode 5 { 6 int m_nValue; 7 BinaryTreeNode* m_pLeft; 8 BinaryTreeNode* m_pRight; 9 }; 10 11 BinaryTreeNode* CreateBinaryTr

jsp的权限控制思路

这两天接触的一个项目的权限控制思路,控制页面权限.action权限.页面内容权限 1用户 2角色 3权限组 4权限 5菜单 权限控制的5个基本模块: 用户: 用户与角色关联 角色: 角色与权限关联 给角色赋予权限:将所有权限列出: 权限组:用于归类权限 权限: 权限可以是一个菜单(当权限的url和菜单的url相同时即为菜单权限) 获取菜单列表时根据权限过滤菜单: if (menuUrl.equals(auth.getUrl()) || (user!=null && user.getId()

securityoverridehacking challenge 解题思路汇总——Advanced

继续上一篇securityoverridehacking challenge 解题思路汇总的工作,这次把Advanced给弄完了.这当中主要涉及到了关于php的一些攻击方法,可以以此为基础做一个深入的了解. 3      Advanced 3.1     PHP Sucks 利用PHP中==的跨类型比较而产生的漏洞.最终目的是要$input=="0000". 这个好办,php中,任何数字型字符串最终都会转化为数字去做比较,所以input可以是任意个0.不过Filter最后加了个正则判断