最近很多小伙伴都在问PHP中你可能忽略的性能优化利器:生成器和php性能优化这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Android你可能忽略的提高敲代码效率的方式、gola
最近很多小伙伴都在问PHP中你可能忽略的性能优化利器:生成器和php 性能优化这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Android 你可能忽略的提高敲代码效率的方式、golang框架的代码生成器:性能优化、Intellij IDEA开发中你可能忽略使用的那些快捷键、js 性能优化利器:prepack等相关知识,下面开始了哦!
本文目录一览:- PHP中你可能忽略的性能优化利器:生成器(php 性能优化)
- Android 你可能忽略的提高敲代码效率的方式
- golang框架的代码生成器:性能优化
- Intellij IDEA开发中你可能忽略使用的那些快捷键
- js 性能优化利器:prepack
PHP中你可能忽略的性能优化利器:生成器(php 性能优化)
前言
如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生。但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显。但是,生成器功能的确非常有用。
什么情况之下,会遇到PHP性能问题?
1:PHP语法使用不恰当。
2:使用PHP语言做了它不擅长的事情。
3:使用PHP语言连接的服务不给力。
4:PHP自身的短板(PHP自身做不了的事情)。
5:我们也不知道的问题?(去探索、分析找到解决办法,提升开发境界)。
优点
直接讲概念估计你听完还是一头雾水,所以我们先来说说优点,也许能勾起你的兴趣。那么生成器有哪些优点,如下:
- 生成器会对PHP应用的性能有非常大的影响
- PHP代码运行时节省大量的内存
- 比较适合计算大量的数据
那么,这些神奇的功能究竟是如何做到的?我们先来举个例子。
概念引入
首先,放下生成器概念的包袱,来看一个简单的PHP函数:
function createRange($number){ $data = []; for($i=0;$i<$number;$i++){ $data[] = time(); } return $data; }
这是一个非常常见的PHP函数,我们在处理一些数组的时候经常会使用。这里的代码也非常简单:
- 我们创建一个函数。
- 函数内包含一个for循环,我们循环的把当前时间放到$data里面
- for循环执行完毕,把$data返回出去。
下面没完,我们继续。我们再写一个函数,把这个函数的返回值循环打印出来:
$result = createRange(10); // 这里调用上面我们创建的函数 foreach($result as $value){ sleep(1);//这里停顿1秒,我们后续有用 echo $value.''<br />''; }
我们在浏览器里面看一下运行结果:
这里非常完美,没有任何问题。(当然sleep(1)效果你们看不出来)
思考一个问题
我们注意到,在调用函数createRange的时候给$number的传值是10,一个很小的数字。假设,现在传递一个值10000000(1000万)。
那么,在函数createRange里面,for循环就需要执行1000万次。且有1000万个值被放到$data里面,而$data数组在是被放在内存内。所以,在调用函数时候会占用大量内存。
这里,生成器就可以大显身手了。
创建生成器
我们直接修改代码,你们注意观察:
function createRange($number){ for($i=0;$i<$number;$i++){ yield time(); } }
看下这段和刚刚很像的代码,我们删除了数组$data,而且也没有返回任何内容,而是在time()之前使用了一个关键字yield
使用生成器
我们再运行一下第二段代码:
$result = createRange(10); // 这里调用上面我们创建的函数
foreach($result as $value){
sleep(1);
echo $value.''<br />'';
}
我们奇迹般的发现了,输出的值和第一次没有使用生成器的不一样。这里的值(时间戳)中间间隔了1秒。
这里的间隔一秒其实就是sleep(1)造成的后果。但是为什么第一次没有间隔?那是因为:
- 未使用生成器时:createRange函数内的for循环结果被很快放到$data中,并且立即返回。所以,foreach循环的是一个固定的数组。
- 使用生成器时:createRange的值不是一次性快速生成,而是依赖于foreach循环。foreach循环一次,for执行一次。
到这里,你应该对生成器有点儿头绪。
深入理解生成器
代码剖析
下面我们来对于刚刚的代码进行剖析。
function createRange($number){ for($i=0;$i<$number;$i++){ yield time(); } } $result = createRange(10); // 这里调用上面我们创建的函数 foreach($result as $value){ sleep(1); echo $value.''<br />''; }
我们来还原一下代码执行过程。
- 首先调用createRange函数,传入参数10,但是for值执行了一次然后停止了,并且告诉foreach第一次循环可以用的值。
- foreach开始对$result循环,进来首先sleep(1),然后开始使用for给的一个值执行输出。
- foreach准备第二次循环,开始第二次循环之前,它向for循环又请求了一次。
- for循环于是又执行了一次,将生成的时间戳告诉foreach.
- foreach拿到第二个值,并且输出。由于foreach中sleep(1),所以,for循环延迟了1秒生成当前时间
所以,整个代码执行中,始终只有一个记录值参与循环,内存中也只有一条信息。
无论开始传入的$number有多大,由于并不会立即生成所有结果集,所以内存始终是一条循环的值。
概念理解
到这里,你应该已经大概理解什么是生成器了。下面我们来说下生成器原理。
首先明确一个概念:生成器yield关键字不是返回值,他的专业术语叫产出值,只是生成一个值
那么代码中foreach循环的是什么?其实是PHP在使用生成器的时候,会返回一个Generator类的对象。foreach可以对该对象进行迭代,每一次迭代,PHP会通过Generator实例计算出下一次需要迭代的值。这样foreach就知道下一次需要迭代的值了。
而且,在运行中for循环执行后,会立即停止。等待foreach下次循环时候再次和for索要下次的值的时候,for循环才会再执行一次,然后立即再次停止。直到不满足条件不执行结束。
实际开发应用
很多PHP开发者不了解生成器,其实主要是不了解应用领域。那么,生成器在实际开发中有哪些应用?
读取超大文件
PHP开发很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如5个G。这时,直接一次性把所有的内容读取到内存中计算不太现实。
这里生成器就可以派上用场啦。简单看个例子:读取text文件
我们创建一个text文本文档,并在其中输入几行文字,示范读取。
<?php header("content-type:text/html;charset=utf-8"); function readTxt() { # code... $handle = fopen("./test.txt", ''rb''); while (feof($handle)===false) { # code... yield fgets($handle); } fclose($handle); } foreach (readTxt() as $key => $value) { # code... echo $value.''<br />''; }
通过上图的输出结果我们可以看出代码完全正常。
但是,背后的代码执行规则却一点儿也不一样。使用生成器读取文件,第一次读取了第一行,第二次读取了第二行,以此类推,每次被加载到内存中的文字只有一行,大大的减小了内存的使用。
这样,即使读取上G的文本也不用担心,完全可以像读取很小文件一样编写代码。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
- php性能优化之不要在for循环中操作DB
- php之性能优化案例
- 浅谈PHP性能优化之php.ini配置
- PHP+swoole+linux实现系统监控和性能优化操作示例
- PHP性能优化大全(php.ini)
- php性能优化进阶不要在for循环中DB操作
Android 你可能忽略的提高敲代码效率的方式
作为学习 kotlin 的一款 app,在撸代码的过程中学习 kotlin 的语法及特性。
Eyepetizer-in-Kotlin 适合初学者作为学习 kotlin 语言的一个项目,可以在做项目的同时体验到 kotlin 语言的优点。
https://github.com/LRH1993/Eyepetizer-in-Kotlin
本文作者
本文由大力 - 哥投稿。
大力 - 哥的博客地址:
http://blog.csdn.net/qq137722697
本篇将从 Live Templates 简介,常用 AS 自带模板,自定义模板三个方面开展介绍,并且只介绍 Live Templates 中 Java 代码方面的使用,其余感觉不是很常用,看完这篇之后你可以自己研究一下。
一个好的程序猿应该是花更多的时间在处理业务处理上,而不是重复敲相同的代码,一行代码节约 1s 也是节约。看完这篇之后你会觉得 AS 确实越来越强大了,简直是 Android 程序猿的福音呀,希望推出更多提高开发效率的工具或插件。废话不多说,直接进入主题。
1
什么是 Live Templates
没有统一的翻译,代码模板、热键模板、动态模板随便叫哪个都行
作用
-
代码快速补全
-
提高写代码的速度
位置
-
Settings->Editor->Live Templates
用法
-
全关键字型:关键字–> 回车
-
后缀关键型:使用对象。关键字–> 回车
简单使用
先来两个效果图,吊一下胃口,更加实用的还在后面
AS 自带模板
快速打印日志
logt –> 快速补全 TAG
loge—> 快速补全 Log.e (TAG,”“);
自定义模板
输入 sin 回车即自动补全单例模式所需的代码
系统自带模板
系统自带模板从两个方面讲解,全关键字型和后缀关键型,由于篇幅的原因,这里只讲解常用的一些模板,未讲解到的可以到 Settings->Editor->Live Templates 中查看
2
全关键字型
先来说说什么是全关键字型,其实就是输入关键字–> 回车,
eg:输入 loge 回车即会自动打印出
Log.e(TAG, "onCreate: ", );
(1)findViewById
在此之前我们在 Activity 中找到一个 view 可能是这样写的:
有了 fbc 之后我们可以这样写:fbc 回车
(2)定义常量
以前你写整形常量是不是要一个单词的敲出: private static final int 。。。
还有更快的写法:const 回车
字符串常量也有:key 回车
其他常量,目前 as 只提供了整形和字符串类型常量的模板,学了后面的自定义之后你就可以定义其他类型的了,当然还有一种捷径:psf 回车即可快速补全
public static final
(3)for 循环
相信很多小伙伴也觉得每次都要写整个 for 循环好麻烦,as 提供了:fori 回车,看对比图
这里还有一个隐藏的模板,sout 回车 即可快速补全 System.out.printf (“”);
(4)if 判断
ifn 回车(推荐)
inn 回车
(5)隐藏 View
gone
(6)快速在子线程中切换到主线程
rouiT
(7)字符串格式化
Sfmt
(8)快速实现自定义 View 的三个构造方法
ViewConstructors
个人觉得这个是一个非常实用的模板了,比快捷键还方面,不行你自己试试
OK 全关键字型就只讲这些常用的了,不常用的可以去设置中查看。
3
后缀关键型
再来说说什么是后缀关键型,其实就是 “使用对象。关键字–> 回车”,继续往下看就知道是什么啦:
判断
-
.notnull
-
.null
局部变量
.var
全局变量
.field
这个也是一个非常实用的模板,在代码量非常多的类中就更加突出了,不用跑到来的最前面定义右跑回来初始化。
循环
-
.for 增强 for 循环
-
.fori 正序遍历
-
.forr 逆序遍历
还有针对下标的
return 返回
.return
类型转换
.cast
抛出异常
.try
字符串格式化
.format
分支
.switch
后缀型的也只讲这些常用的了,快进入激动的自定义模板。
4
自定义模块
我这里给出几个比较常用的自定义模板,如果你觉得有比较好的可以抽取出来的,欢迎留言。
(1)单例模式
还是一开始就给出的单例模式,再来看看效果图:
是不是很带感,来看看怎么设置(建议先新建一个 Template Group,便于管理):
然后点击 Edit variables
下面是单例模式的模板(根据个人写单例模式的习惯来)
来看看上面涉及到的知识:
更详细的 Expression 介绍:
https://www.jetbrains.com/help/idea/2016.1/live-template-variables.html
Skip if defined :
如果选中,光标会直接跳到句末,不会停留在某个变量处。
(2)click
模板:
public void onClick(View view) {
switch (view.getId()) {
case R.id.$resId$:
$content$
break;
default:
break;
}
}
(3)打印带定位功能的日志
新建 dl (名字自拟)为下面的模板
Log.e("$class$",
"$method$($class$.java:$line$)"+$content$);
为什么打印下面的代码就可以定位到指定类所在的行数呢?
Log.e("MainActivity",
"onCreate(MainActivity.java:13)我是日志内容");
告诉你一个小秘密,logcat 中只要打印的内容中带有”(类名.java: 行号)” 就可以自动变为可点击的链接,点击之后就可以跳转到改类指定的行数。
这样就实现了打印带定位功能的日志,但是这个是有一定的局限性的,比如打印语句之前很可能会增加代码,由于行数是固定死的,此时就会导致定位有一定的误差。怎么解决呢?这里推荐看一个日志打印的工具类,android studio 日志打印神器,日志代码跟踪器 ELog。
(4)Switch
快速搭建模式、防止漏掉 break 和 default
switch ($content$) {
case $value$:
$code$
break;
default:
break;
}
(5)字符串非空判断
这也是一个非常实用的模板了
TextUtils.isEmpty($content$);
golang框架的代码生成器:性能优化
Golang 框架的代码生成器:性能优化
引言
代码生成器是一种强大的工具,用于自动生成代码以简化开发过程。在 Golang 中,有许多优秀的代码生成器可用,但大多数都缺乏性能优化功能。本文将介绍一种专注于性能优化的 Golang 代码生成器。
立即学习“go语言免费学习笔记(深入)”;
代码生成器
该代码生成器基于代码模版和反射机制。它允许用户定义自己的模版文件,其中包含用于生成代码的占位符。代码生成器通过解析和执行模板文件来生成代码。
为了优化性能,该代码生成器采用了以下技术:
- 模版缓存:模版文件仅解析一次并存储在缓存中,以避免重复解析开销。
- 代码重用:通用代码块(如数据结构和方法)在多个模版中重用,以减少生成重复代码。
- 代码分析:代码生成器会分析生成的代码并应用优化,如内联函数和数据结构扁平化。
- 并发:代码生成过程可以并行执行,以充分利用多核 CPU。
实战案例
考虑一个生成 REST API 控制器的代码生成器。控制器通常包含用于处理 HTTP 请求的方法。使用代码生成器,可以为不同的 HTTP 动词定义模版文件,并指定要包含的通用代码块。
// controller_template.tmpl // Package defines the package for the generated controller. package {{.Package}} // {{.StructName}}Controller defines the controller for {{.Resource}} resources. type {{.StructName}}Controller struct { // Embed the default controller implementation. Controller // Add custom methods here. }
// main.go package main import ( // Import the controller generator. "github.com/example/gocodegen" // Import the template files. "github.com/example/gocodegen/templates/controller" ) func main() { // Generate controllers for different HTTP methods. codegen.Generate("PostController", "POST", controller.PostTemplate) codegen.Generate("GetController", "GET", controller.GetTemplate) // ... // Run the generated controllers. // ... }
性能提升
经过优化后,代码生成器可以显着提高性能。在基准测试中,使用缓存和重用代码块将生成时间减少了 50% 以上。并发代码生成进一步提高了性能,在 4 核 CPU 上将生成时间减少了 30% 以上。
结论
本文介绍了一种专注于性能优化的 Golang 代码生成器。通过采用代码模版缓存、代码重用、代码分析和并发等技术,该代码生成器可以显著提高生成时间。
以上就是
Intellij IDEA开发中你可能忽略使用的那些快捷键
IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn、github等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。
IntelliJ IDEA工具在有些方面比较优秀,IDEA提倡只能编程节省程序员工作量,有很多特色功能如编码辅助JavaScript自动补全功能、html页面编写代码功能,灵活排版功能等,相对于Eclipse的IDE工具实用很多。下面小编讲述一下IntelliJ IDEA在开发中常用快捷键和可能忽略使用的快捷键等等。
Intellij IDEA最常用快捷键
Ctrl+E,可以显示最近编辑的文件列表
Shift+Click可以关闭文件
Ctrl+[或]可以跳到大括号的开头结尾
Ctrl+Shift+Backspace可以跳转到上次编辑的地方
Ctrl+F12,可以显示当前文件的结构
Ctrl+F7可以查询当前元素在当前文件中的引用,然后按F3可以选择
Ctrl+N,可以快速打开类
Ctrl+Shift+N,可以快速打开文件
Alt+Q可以看到当前方法的声明
Ctrl+W可以选择单词继而语句继而行继而函数
Alt+F1可以将正在编辑的元素在各个面板中定位
Ctrl+P,可以显示参数信息
Ctrl+Shift+Insert可以选择剪贴板内容并插入
Alt+Insert可以生成构造器/Getter/Setter等
Ctrl+Alt+V 可以引入变量。例如把括号内的SQL赋成一个变量
Ctrl+Alt+T可以把代码包在一块内,例如try/catch
Alt+Up and Alt+Down可在方法间快速移动
Intellij IDEA查询快捷键
CTRL+N 查找类
CTRL+SHIFT+N 查找文件
CTRL+SHIFT+ALT+N 查找类中的方法或变量
CIRL+B 找变量的来源
CTRL+ALT+B 找所有的子类
CTRL+SHIFT+B 找变量的类
CTRL+G 定位行
CTRL+F 在当前窗口查找文本
CTRL+SHIFT+F 在指定窗口查找文本
CTRL+R 在 当前窗口替换文本
CTRL+SHIFT+R 在指定窗口替换文本
ALT+SHIFT+C 查找修改的文件
CTRL+E 最近打开的文件
F3 向下查找关键字出现位置
SHIFT+F3 向上一个关键字出现位置
F4 查找变量来源
CTRL+ALT+F7 选中的字符查找工程出现的地方
CTRL+SHIFT+O 弹出显示查找内容
Intellij IDEA自动代码
ALT+回车 导入包,自动修正
CTRL+ALT+L 格式化代码
CTRL+ALT+I 自动缩进
CTRL+ALT+O 优化导入的类和包
ALT+INSERT 生成代码(如GET,SET方法,构造函数等)
CTRL+E 最近更改的代码
CTRL+SHIFT+SPACE 自动补全代码
CTRL+空格 代码提示
CTRL+ALT+SPACE 类名或接口名提示
CTRL+P 方法参数提示
CTRL+J 自动代码
CTRL+ALT+T 把选中的代码放在 TRY{} IF{} ELSE{} 里
Ctrl+Shift+T 创建单元测试
Intellij IDEA复制快捷方式
CTRL+D 复制行
CTRL+C 选中代码进行复制
CTRL+X 剪切,删除行
Intellij IDEA其他快捷方式
CIRL+U 大小写切换
CTRL+Z 倒退
CTRL+SHIFT+Z 向前
CTRL+ALT+F12 资源管理器打开文件夹
ALT+F1 查找文件所在目录位置
SHIFT+ALT+INSERT 竖编辑模式
CTRL+/ 注释//
CTRL+SHIFT+/ 注释/*...*/
CTRL+W 选中代码,连续按会有切换效果
CTRL+B 快速打开光标处的类或方法
ALT+ ←/→ 切换代码视图
CTRL+ALT ←/→ 返回上次编辑的位置
ALT+ ↑/↓ 在方法间快速移动定位
SHIFT+F6 重构-重命名
CTRL+H 显示类结构图
CTRL+Q 显示注释文档
ALT+1 快速打开或隐藏工程面板
CTRL+SHIFT+UP/DOWN 代码向上/下移动。
CTRL+UP/DOWN 光标跳转到第一行或最后一行下
ESC 光标返回编辑框
SHIFT+ESC 光标返回编辑框,关闭无用的窗口
F1 帮助
CTRL+F4 强制关闭
Intellij IDEA不常用的快捷键
Alt+Enter 自动修复
Ctrl+Shift+Alt+N 可以快速打开符号
Ctrl+Shift+Space 在很多时候都能够给出Smart提示
Alt+F3 可以快速寻找
Ctrl+/和Ctrl+Shift+/ 可以注释代码
Ctrl+Alt+B 可以跳转到抽象方法的实现
Ctrl+O 可以选择父类的方法进行重写
Ctrl+Q 可以看JavaDoc
Ctrl+Alt+Space 类名或接口名提示
Ctrl+J 自动代码
Ctrl+Shift+F7 可以高亮当前元素在当前文件中的使用
Ctrl+Alt+Up /Ctrl+Alt+Down 可以快速跳转搜索结果
Ctrl+Shift+J 可以整合两行
Alt+F8 计算变量值
快捷键参考资料:http://blog.yoodb.com/yoodb/article/detail/1326
因每个人可能使用电脑不同IntelliJ IDEA内存可以根据机器本身配置而优化,具体优化参数配置如图:
注:-Xms512m 设置初时的内存大小,提高Java程序的启动速度
-Xmx750m 设置最大内存数,提高该值,可以减少内存Garage收集的频率,提高程序性能
-Xverify:none 关闭Java字节码验证,从而加快了类装入的速度,并使得在仅为验证目的而启动的过程中无需装入类,缩短了启动时间
-XX:+UseParNewGC 使用并行收集算法
-server 控制内存garage方式,这样你无需在花一到两分钟等待内存garage的收集
-Dsun.awt.keepWorkingSetOnMinimize=true 可以让IDEA最小化到任务栏时依然保持以占有的内存,当你重新回到IDEA,能够被快速显示,而不是由灰白的界面逐渐显现整个界面,加快回复到原界面的速度。
优哉游哉
更多推荐:《优哉游哉》
涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。
本文分享自微信公众号 - Java精选(w_z90110)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
js 性能优化利器:prepack
1. js 性能优化
js
本身是没有像 python
一样的预编译功能,更没有像 java
一样的编译功能,所以,这里所说的 js 代码预编译
只是通过工具实现的类似功能而已。
这就要提到 prepack 了,它的思路大致是这样:
把不依赖外部环境的逻辑提前进行运算,并把运算结果替换到相应的源码处,然后从源码中移除这段逻辑。
2. prepack
2.1 安装
2.2 编译(打印在命令行)
2.3 编译后输出文件
2.4 示例
源代码
编译后的代码
2.5 配合构建工具一起使用
- prepack-webpack-plugin: A webpack plugin for Prepack
- rollup-plugin-prepack: A Rollup plugin for Prepack
- prepack-vscode: A Visual Studio code plugin for Prepack
2.6 问题
- 目前最新版本是
0.2.51
,还一直在开发中,很多功能都还没有实现,包括模块输入输出的优化
关于PHP中你可能忽略的性能优化利器:生成器和php 性能优化的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Android 你可能忽略的提高敲代码效率的方式、golang框架的代码生成器:性能优化、Intellij IDEA开发中你可能忽略使用的那些快捷键、js 性能优化利器:prepack的相关信息,请在本站寻找。
本文标签: