首页
学习
活动
专区
圈层
工具
发布

我在优化代码时学到的那些事

大学时我总以为写代码就是告诉电脑一步步该怎么做。等到真正开始做底层开发,才意识到现代编译器简直就是个有魔法的黑盒子。调试一个性能问题时,我发现编译器把我写的20多行代码优化成了只有5条汇编指令!...好家伙,它偷偷替我做了这么多工作:常量折叠:让编译器替你算数学还记得我第一次看反汇编结果时的震惊 - 我代码里的width * 800 + height * 600直接变成了一个硬编码的数字。...实际工作中,我经常会看到新人写这样的代码:float calculateArea() { return 3.14159265358979 * radius * radius;}每次调用都要算一遍圆周率...,特别是当我知道某些操作特别耗时(比如除法和取模)时。...出过几次bug后,我学会了在科学计算代码里避免使用它。真实故事:我是如何修复渲染引擎的回到开头说的那次性能优化。我们的渲染引擎有个着色器编译环节特别慢。

11600
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    反思我在管理中犯过的重大错误

    近一年来,我在管理中犯下的2个重要错误。该错误导致团队结构不清晰,骨干核心人员不稳定,易流失。...1、资源错配 2、逮着一个人疯狂用 目录 1、背景描述; 2、我是如何犯错的,以及我为什么犯错; 3、这两个错误带来了哪些影响; 4、规避和改进方式; 一、背景描述 成立3年的初创公司,10人编制的测试团队...团队人员结构分布是 1个经理、2个高级、3中级、4初级;组内划分是分成了3个小组,2个业务测试小组,一个测试基础小组。...组内结构划分可见下图所示: 二、我是如何犯错的,以及我为什么犯错 错误一:资源错配 对于组长的选择,以及组内骨干的选择,如下图所示: 其中标记为组长的,是在团队内部小组内被任命为小组长,标记为骨干的...两个业务小组中,初中级员工干中高级员工的活,中高级人员为相对边缘角色。这样的资源错配,直接引发了核心、骨干员工的离职率高的后果。 我为什么会这样做: 本质上是一个“谁能谁上”还是“谁上谁能”的问题。

    1.9K10

    我在使用 Go 过程中犯过的低级错误

    循环中引用迭代器变量 循环迭代器变量是一个在每次循环迭代中采用不同值的单个变量。如果我们一直使用一个变量,可能会导致不可预知的行为。...解决方法也很简单,v 作为一个参数传入 goroutine 中,每个 v 都会被独立计算并保存到 goroutine 的栈中,从而得到预期的结果。...WaitGroup类型的共享变量,如下面的代码所示,第7行的Wait()只有在第5行的Done()被调用len(tasks)次时才能解除阻塞,因为它被用作调用第2行的Add()的参数。...不使用 -race 选项 我经常见到的一个错误是在测试 go 应用的时候没有带 -race 选项。...race // to build the package $ go install -race pkg // to install the package 启用竞争检测器后,编译器将记录在代码中访问内存的时间和方式

    3.2K10

    我在自己的桌面端应用中运行了小程序

    直到偶然间看到阮一峰大佬的博客介绍到 FinClip 可以支持在移动端和桌面端(Windows、Linux和 macOS)运行小程序,那就随便上手试试。图片说干就干!...图片细细想下,这样标准容器化的好处,可以保证在开发语言环境存在差异下,“套壳子的小程序”能独立运行的同时,也可以与“其他套壳子的小程序”联动使用。...SDK 前还需要在 FinClip 的后台上架小程序,我上架了官方的示例小程序代码包,也尝试了直接把微信小程序的代码包上传到 IDE 中的,发现也能兼容。...以下是我桌面端实际运行小程序的结果。图片如果做一定适配优化,小程序的展示尺寸还可以适配打开窗口大小,效果也不错。...图片个人认为一些企业做OA模块化开发还挺适合在桌面端用小程序的,毕竟小程序能够实现动态化的更新,不必硬要通过迭代更新实现。好了以上就是我瞎折腾的全过程,欢迎各位大佬拍砖。

    1.9K30

    我在软件工程师生涯中犯下的七个错误

    希望在阅读这篇文章后,你会从中得到一些有用的东西,这样以后就不要再像我一样犯错——并付出那么多代价了。 1没有使用合适的 ORM 数据访问层代码总是会一团乱麻、无聊和令人生厌。...但我还是希望自己一开始就能使用合适的 ORM(例如 NHibernate)来完成这项工作。至少当我的用户数量不断增长时,我就用不着再担心改变数据库供应商的事情了。...我曾花了很多时间来给我的代码编写文档(还是 XML 文档,还记得吗?),结果只是发现每当我更改代码时都需要更新文档才行。...更新代码是必要的,但更新 XML 文档就不是那回事了:这是一种负担,它只会浪费你的时间,而且毫无意义。到最后,我在更改 XML 文档时失去了耐心,转而去做其他更有意义的事情。...但是,如果你沉迷在调试器里面,它就会带来害处。想象一下,如果你的方法只在应用程序启动并运行 45 分钟后才会被调用,你是否要等待 45 分钟才能到达这个点上,然后才开始调试呢?

    84410

    我在安装Python库的时候一直出这个错误,尝试了很多方法,怎么破?

    大家好,我是皮皮。 一、前言 前几天在Python星耀群【我喜欢站在一号公路上】问了一个Python库安装的问题,一起来看看吧。...下图是他的一个报错截图: 二、实现过程 这里【对不起果丹皮】提示到上图报错上面说要你安装pep517,但是这个好像还挺难的。后来【莫生气】提示别省事,一个一个的去安装。...主要txt文件里边的库太多了,而且格式不太规则,挨个安装后,后来暂时没有发现问题。 三、总结 大家好,我是皮皮。...这篇文章主要盘点了一个Python库安装的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。

    46130

    Transformer中的Self-Attention机制到底在算什么?我用通俗语言和代码给你整明白!

    Transformer中的Self-Attention机制到底在算什么?我用通俗语言和代码给你整明白!一、前言:Transformer真香,但Self-Attention到底在“注意”啥?...后来我一边写代码,一边画图,一边做实验,才真正搞明白一件事:Self-Attention的本质就是——让每个词根据“整体上下文”来重新给自己赋值,而不是只看邻居。...别怕,我们今天就从头到尾梳理清楚这个机制到底在“算”什么,我还会用代码 + 举例让你一口气通透理解它的逻辑!二、什么是Self-Attention?一句话理解!...”Key 是“我对别人来说有多重要”Value 是“我的信息值”这就像一个社交场合:Q是你发出关注的“雷达”,K是别人身上的“吸引力”,而V是真正的内容。...我们其实就是:用Q去看K → 得到权重用权重去加权V → 得到新表示这套逻辑,就是Self-Attention的本质。

    30300

    Android 在一个APP里打开另一个APP

    前言 不知道你们有没有注意过,每次打开一些软件的时候都会有广告引导页,有时候手滑点到了,会有进入手机上的另一个APP,这有没有引起你的注意呢? 运行效果图 ?...一旦两个应用程序里面改动了代码你就要在手机上运行一下,否则你改动的代码就不会生效 然后运行一下: ? 传值的问题就解决了。...③ 打开指定页面 通过包名跳转APP是进入默认的启动页面,你可以打开你的AndroidManifest.xml文件查看 ?...因为是要DemoB的TestActivity页面,所以这个activity在AndroidManifest.xml中需要配置 android:exported 属性,布尔类型,是否支持其他应用访问目标...然后运行在手机上,再修改DemoA的MainActivity ? 运行效果 ? 其实还有一种方式是通过URL打开另一个APP,但是我不推荐这样做,为什么?没有原因…

    2.9K30

    Android安全攻防战,反编译与混淆技术完全解析(上)

    反编译 我们都知道,Android程序打完包之后得到的是一个APK文件,这个文件是可以直接安装到任何Android手机上的,我们反编译其实也就是对这个APK文件进行反编译。...在开始学习之前,首先我们需要准备一个APK文件,为了尊重所有开发者,我就不拿任何一个市面上的软件来演示了,而是自己写一个Demo用来测试。...这里我希望代码越简单越好,因此我们建立一个新项目,在Activity里加入一个按钮,当点击按钮时弹出一个Toast,就这么简单,代码如下所示: public class MainActivity extends...当然即使你在和我执行一模一样的操作,也有可能会在这里反编译失败,比如说会报如下错误: ?...签名之后的APK文件现在已经可以安装到手机上了,不过在此之前Android还极度建议我们对签名后的APK文件进行一次对齐操作,因为这样可以使得我们的程序在Android系统中运行得更快。

    1.9K80

    破解验证,让爬取更随心所欲!

    • classes.dex:源代码编译成class后,转成jar,再压缩成dex文件,dex是可以直接在Android虚拟机上运行的文件。 • lib文件夹:引用的第三方sdk的so文件。...通过反编译,我们一般想要得到里面的AndroidManifest.xml文件、res文件和java代码。...(2) dex2jar反编译dex文件,得到java源代码 上一步中,我们得到了反编译后的资源文件,这一步我们还想看java源代码。这里要用的工具就是dex2jar。...dex文件时Android虚拟机上面可以执行的文件,jar文件大家都是知道,其实就是java的class文件。在官网有详细介绍。...note1:第一次下载下来后,在mac里运行的时候可能会提示需要管理员的权限,这里我给这些sh脚本chmod 777后,即可运行它。 ?

    1.9K91

    Android Studio新功能解析,你真的了解Instant Run吗?

    传统情况下,我们修改程序后重新运行一次程序需要经历 代码重新编译 -> 停止程序 -> 重新安装 -> 重新启动 这样一个过程,而Instant Run则尝试只将程序变更的部分部署到手机上,尽量避免重新安装或重新启动程序...当我们第一次运行程序之后,Android Studio中的运行按钮会变成这个样子: ? 可以看到,运行的三角形旁边多了一个闪电符号,这就说明现在可以使用Instant Run了。...可以看到,我改动了布局文件中的内容,重新运行后速度仍然很快,应用程序并没有重新安装或重启,只是Activity重启了一下,因为要将修改后的布局内容展示到界面上。...Full APK 除了满足以上条件的其他程序变更,Instant Run目前都还不支持,主要包括以下一些情况: 改变AndroidManifest.xml文件的内容 改变被AndroidManifest.xml...文件所引用的资源,比如string.xml中的app_name 改变桌面widget的UI相关元素 当程序变更不被Instant Run所支持时,就会执行完整的APK安装过程,同时Android Studio

    1.7K80

    APP渗透

    一般来说,先将安卓设备中的文件复 制到有鼠标的主机上,方便查看。 首先查看相关文件的权限配置。...我自己的理解就是 app中是否使用app自己定义的键盘如果使用的是系统自带的键盘那么则可被记录。 在通俗点数哦 使用系统的输入法才能键盘记录。 例如这种就是安全的。...注册时 当我们输入注册的密码为123456等弱口令时。查看客户端是否允许。 如上图 不允许 此项安全 账号登陆限制 测试一个帐号是否可以同时在多个设备上成功登录客户端,进行操作。...不能则此项安全 账户锁定策略 测试客户端是否限制登录尝试次数。防止木马使用穷举法暴力破解用户密码。 我们多次尝试输错密码 看看app是否会限制登陆错误次数。...我自己的理解就是 当我填了账号密码后 切换到了其他app。再回来时 账号密码应该被清空而不是一直保留。 如果登陆了测试app后切换到了其他app ,几分钟之内 测试app是否会自动注销。

    1.3K10

    App渗透 - Android应用的错误中获取漏洞

    我知道这一点的原因是在它的源代码中(在Jadx-gui中),我可以看到保存证书的地方在源代码中也提到了SharedPreferences。 ? ? ? 4. 不安全的数据存储 (2) ?...对于第二部分,源码显示,这次的凭证存储在SQL数据库中。 ? 在数据库中,有4个文件。在ids2文件内容中发现了密码。 ? ? 5. 不安全的数据存储(3) ?...如图所示,保存好凭证后,我查看了java源代码。 如图所示,我们可以看到,创建了一个临时文件来保存凭证。 这个临时文件是在/data/data/jakhar.aseem.diva目录下创建的。 ?...不安全的数据存储(4) ? 在这个任务中,当我试图保存我的凭证时,它说,'发生文件错误'。 查看源码,注意到应用程序正试图将凭证存储在设备外部存储中。...在允许Diva的存储权限后,我又尝试保存凭证,成功! 现在,在终端中,你可以看到证书被保存在/sdcard/.uinfo.txt中 ? 7. 输入验证问题 ? 该应用程序要求输入一个有效的用户名。

    1.7K30

    Android 逆向工具篇—反编译工具的选择与使用

    越来越多的应用由C/C++编写核心代码,以SO文件的形式供上层JAVA代码调用,以保证安全性,这个目录是逆向解密关注的重点 classes.dex(一个或数个) Android程序运行在Dalvik虚拟机上...二、工具的文档和文章不算充分,在搜索逆向工具教程时,比较难找到其相关介绍。 三、只能在windows平台运行和使用,不支持mac等其他平台,这很遗憾。...所以不如直接看一下工具栏中的快捷键,只用一个。 文件-首选项中,如果内存够用,我建议勾选“自动进行后台反编译”,因为Jadx默认只有在你展开内容或者搜索内容时,才会开始反编译。...[3]: 得到的并不是Java源代码,这是个错误的说法,但对初学者来说比较容易理解。不管你通过什么工具反编译apk,得到的java代码都和Apk开发时的源代码相差甚远。...我们能得到的仅仅是一种伪代码,它可能存在错误的逻辑、奇怪的变量名、各种各样的error,但代码总体上是靠谱的。

    32.2K32

    Android模块化(三) , 模块可插拔单独编译运行

    《我所理解的Android模块化(一)》;   《我所理解的Android模块化(二)》; 下面主要来讲一下单一模块的独立编译运行和插拔式的集成。...单一模块的独立编译运行 模块化的好处之一就是单一模块可以独立的开发编译运行安装到用户的手机上,这样就方便了对某一模块的单独开发调试,单一模块生成的apk体积也小,编译时间也快,开发效率会高很多。...从上图中我们可以看到有两个AndroidManifest.xml,一个在app目录下,一个在module下,主要是做什么用的呢?...这是因为在module_user中的build.gradle文件中加入了这样的代码来控制此库是library还是APP: if (!...') } 如此我们只需要在根目录gradle.properties配置文件中的改动一下isNeedUserModule变量的参数即可实现用户模块的可插拔形式集成和独立运行。

    2.2K30

    靶机实战 |『VulnHub系列』Bottleneck 1-Walkthrough

    从上图中两个时间戳(方框中的kali系统当前时间的时间戳,椭圆中的时间戳是靶机上的)可以看出,我的kali系统与靶机处于同一时区,这里由于手速的问题,两个时间戳的数值相差1。...图中的一些内容并不是response.content中的,只是为了测试方便自己增加的 说来你可能不信,得到上面的结果之后没一会儿,靶机的作者在Twitter上联系我,问我做的怎么样了,我自己都觉得意外,...后来发现打印“丢垃圾”图的位置有两个,第一个是检测到参数f的值在blacklist中的时;第二个是参数f对应的文件为空时。而我正是中了“文件为空”的毒。...从上图中看到当我们尝试使用payload: /etc/passwd 发送请求之后,python脚本处理日志的时候出现了错误。...我把我的思路和尝试过程跟作者说了一下,10小时后作者给了回复。 ?

    2.2K20

    靶机实战 |『VulnHub系列』Bottleneck 1-Walkthrough

    从上图中两个时间戳(方框中的kali系统当前时间的时间戳,椭圆中的时间戳是靶机上的)可以看出,我的kali系统与靶机处于同一时区,这里由于手速的问题,两个时间戳的数值相差1。...图中的一些内容并不是response.content中的,只是为了测试方便自己增加的 说来你可能不信,得到上面的结果之后没一会儿,靶机的作者在Twitter上联系我,问我做的怎么样了,我自己都觉得意外,...后来发现打印“丢垃圾”图的位置有两个,第一个是检测到参数f的值在blacklist中的时;第二个是参数f对应的文件为空时。而我正是中了“文件为空”的毒。...从上图中看到当我们尝试使用payload: /etc/passwd 发送请求之后,python脚本处理日志的时候出现了错误。...我把我的思路和尝试过程跟作者说了一下,10小时后作者给了回复。 ?

    1.5K31

    对一个手游修改器锁机APP的分析

    于是就进行下载分析(使用或分析这种未知风险的APP,建议都在模拟器上进行操作,因为你不知道这APP是否有危害,在模拟器上运行,如果出问题了,顶多就是删除模拟器然后重新再来,如果再手机上运行,那么这个就可能需要你进行刷机才可解决...通过查壳工具(通过识别app中是否有包含第三方加固产品的特定的SO文件)可以看到这个手游修改器是没有采取第三方加固产品进行加固的。...通过APP的AndroidManifest.xml配置文件中,可以识别出这个APP中的包名、SDK版本、四大组件、申请的权限信息。...在APP中的所有申请的权限都存储在AndroidManifest.xml配置文件中。...小结 这个锁机的APP就是通过伪装成为手游修改器,这种在游戏中喜欢作弊的玩家就非常容易中枪,因为普通用户一般拿到APP就会马上进行在手机上安装,那么你只要安装并启动下你就中枪了,你的手机就被锁机了。

    1.1K20

    Android OPPO推送服务集成(详细教学)

    编辑推送消息 结语 前言   为了丰富应用推送的场景和国产大厂设备,在我有这个条件的情况下,相关机型的文章我都会写一遍,这一篇就写一下OPPO的推送服务集成,我本身是荣耀的手机,OPPO是借的朋友的旧手机来测试对接的...创建完成之后先运行到自己手机上,请不要使用模拟器或者虚拟机。 ?...在手机上运行好了之后,安装所需要获取OPPOSign的应用,下载APK签名工具 下载后是一个rar文件,解压之后通过QQ发送到自己的是手机上,然后安装这个APK,安装好之后打开,输入刚才的包名,如下:...这里我标注了三个,但是在App中其实只要用到后面两个,不需要用到AppId。...然后新建一个,然后在com.llw.oppopush包下新建一个MyApplication,继承Application。在onCreate方法中,完成SDK的初始化。

    2.5K10
    领券