欢迎访问晶羽文学网

微信
手机版

写代码说说(QQ说说代码)

2022-10-16 06:30 作者:粤嵌教育 围观:

编写GC高效代码的3个技巧,下面一起来看看本站小编粤嵌教育给大家精心整理的答案,希望对您有帮助

写代码说说(QQ说说代码)1

应用程序性能直接受到垃圾收集(GC)的频率和持续时间的影响,如果在GC策略调优到达瓶颈后,性能的差别就会产生在代码的编写质量了。下面就来说说GC友好代码的几个技巧。

技巧1:预测收集容量

所有标准Java集合,以及大多数自定义和扩展实现(如Trove和Google的Guava)都使用底层数组(基于原语或基于对象)。由于数组在分配后大小是不可变的,因此在许多情况下,向集合中添加项可能会导致删除旧的底层数组,而选择新分配的较大数组。

大多数集合实现都试图优化此重新分配过程,并将其保持在摊销最小值,即使未提供集合的预期大小。但是,通过在构建时为集合提供其预期大小,可以实现最佳效果。

技巧2:直接处理流程

在处理数据流时,例如从文件读取的数据或通过网络下载的数据,通常会看到以下内容:

然后,可以将生成的字节数组解析为XML文档、JSON对象或协议缓冲区消息,以列举一些流行选项。

在处理大型文件或大小不可预测的文件时,这显然是一个坏主意,因为如果JVM无法实际分配整个文件大小的缓冲区,它会使我们暴露出OutOfMemory错误。

更好的方法是使用适当的InputStream(本例中为FileInputStream)并将其直接提供给解析器,而无需首先将整个内容读入字节数组。所有主要库都公开API以直接解析流,例如:

技巧3:使用不可变对象

不变性有许多优点。它对垃圾收集的影响很少得到应有的关注。

不可变对象是一个对象,其字段(在本例中特别是非基本字段)在对象构造后无法修改。

不变性意味着不可变容器引用的所有对象都是在容器构造完成之前创建的。在GC术语中:容器至少和它所持有的最年轻引用一样年轻。这意味着,当对年轻代执行垃圾收集循环时,GC可以跳过位于较老代中的不可变对象,因为它确定这些对象不能引用正在收集的代中的任何对象。

要扫描的对象越少意味着要扫描的内存页越少,而要扫描的内存页越少意味着GC周期越短,这意味着GC暂停时间越短,总体吞吐量越好。


了解更多

写代码说说(QQ说说代码)2

技能:QQ空间标识

适用系统:安卓

难度:2颗星

这年头什么最让人开心?小雷觉得是装X,那种与众不同的感觉会让人上瘾。喜欢发说说的朋友都知道,有些人的确只为记录生活,但有些人却不一样,总会无意将要装的东西显露出来,怕太过直观嫌人家说三道四,又怕人家找不出来他那要秀的东西,各种摆拍只为装X。

小雷也年少轻狂过,这些装的都不算高级,我们要高级一点,利用平台上面大家都能看到的内容进行装X才有意义。该如何理解呢?就是QQ空间平台上面有手机标识、图片地理标识、点赞打赏标识等等,我们要做的就是利用这些标识来为我们装X加分。

为了让你在朋友圈脱颖而出,只需下载一个小小的代码软件,复制里面对应的代码到说说上即可,想要这个有趣好玩的小宝贝,只需要按照下面的指引即可获取哦!

打开软件就会看到这些固定的代码选项,项目是固定的,但是内容是可以改动的,点击即可复制,打开QQ的说说界面粘贴上去即可,虽然原先的代码数值过于夸张,但是不用担心,后面教大家如何修改。

现在开始告诉大家改如何进行数值改动,每串代码都会有一些是看的懂的地方,比如手机型号、地理位置、打赏人数等等这些,看得懂的地方都是可以改动的,标注红框的位置可以根据你想要的内容进行改动。

改完数值后,什么浪漫的土耳其、什么东京和巴黎,这些都能出现在你的QQ空间里面,简单又有趣。

今天的分享课到这里就结束了,祝各位早日掌握这等装X技术,你们的转发分享就是对小雷的大力支持哦!

写代码说说(QQ说说代码)3

今天在 Github 阅读EdgeDB[1]的代码,发现它在处理大量if...elif...else判断的时候,使用了一个非常巧妙的装饰器。我们来看看这个方法具体是什么样的。

正好双十二快到了,假设我们要做一个功能,根据用户的等级判断他可以获得的折扣。常规的if ... elif...写法是这样的:

def get_discount(level):  
    if level == 1:  
        "大量计算代码"  
        discount = 0.1  
    elif level == 2:  
        "大量计算代码"  
        discount = 0.2  
    elif level == 3:  
        discount = 0.3  
    elif level == 4:  
        discount = 0.4  
    elif level == 5:  
        discount = 0.5  
    elif level == 6:  
        discount = 3 + 2 - 5 * 0.1  
    else:  
         return '等级错误'  
    return discount 

大家都知道,这样大量的if ... elif...代码非常难看,也很难维护。并且每个 if 的内部有很多代码。这个函数就会被拉得非常长。

有一些同学知道,可以使用字典来改写这个太长的 if 判断:

def parse_level_1():  
    "大量计算代码"  
    discount = 0.1  
    return discount  
def parse_level_2():  
    "大量计算代码"  
    discount = 0.2  
    return discount  
def parse_level_3():  
    "大量计算代码"  
    discount = 0.3  
    return discount  
def parse_level_4():  
    "大量计算代码"  
    discount = 0.4  
    return discount  
def parse_level_5():  
    "大量计算代码"  
    discount = 0.5  
    return discount  
def parse_level_6():  
    "大量计算代码"  
    discount = 3 + 2 - 5 * 0.1  
    return discount  
discount_map = {  
 1: parse_level_1,  
  2: parse_level_2,  
  3: parse_level_3,  
  4: parse_level_4,  
  5: parse_level_5,  
  6: parse_level_6,  
}  
discount = discount_map.get(level, '等级错误') 

但今天我学到的这个方法,比用字典更简单。我们先来看它的效果:

@value_dispatch  
def get_discount(level):  
    return '等级错误'  
@get_discount.register(1)  
def parse_level_1(level):  
    "大量计算代码"  
    discount = 0.1  
    return discount  
@get_discount.register(2)  
def parse_level_2(level):  
    "大量计算代码"  
    discount = 0.2  
    return discount  
@get_discount.register(3)  
def parse_level_3(level):  
    "大量计算代码"  
    discount = 0.3  
    return discount  
@get_discount.register(4)  
def parse_level_4(level):  
    "大量计算代码"  
    discount = 0.4  
    return discount  
@get_discount.register(5)  
def parse_level_5(level):  
    "大量计算代码"  
    discount = 0.5  
    return discount  
@get_discount.register(6)  
def parse_level_1(level):  
    "大量计算代码"  
    discount = 3 + 2 - 5 * 0.1  
    return discount  
discount = get_discount(3)  
print(f'等级3的用户,获得的折扣是:{discount}') 

运行效果如下图所示:

这样写,比用字典的方式更直观,比直接用if ... elif...更简洁。

那么,这个装饰器value_dispatch是怎么实现的呢?密码就藏在这个开源项目EdgeDB的源代码[2]中,核心代码只有20多行:

并且,还能够实现或查询。例如用户等级为2或者3的时候,折扣都是0.2,那么代码可以写成:

@get_discount.register(2)  
@get_discount.register(3)  
def parse_level_2(level):  
    "大量计算代码"  
    discount = 0.2  
    return discount 

运行效果如下图所示:

它这个代码目前只能实现相等的查询。但其实只要对这个代码稍作修改,我们就能实现大于、小于、大于等于、小于等于、不等于、in等等判断。如果大家有兴趣的话,请在文章下面留言,我们明天就来说说怎么对这个代码进行改造,实现更多的逻辑判断。

相关文章