OpenMP并行编程指南
[TOC]
概述文章参考:http://senlinzhan.github.io/2017/06/25/openmp/
文章参考:https://zhuanlan.zhihu.com/p/51173703
什么是OpenMP?OpenMP(Open Multi-Processing)是一个支持共享存储并行设计的库,是一个编译器指令和库函数的集合。主要是为共享式存储计算机上的并行程序设计使用的。
目前支持OpenMP的语言主要有Fortran,C/C++。
对于 CPU 密集型的程序来说,可以考虑使用 OpenMP 加快程序的计算速度。OpenMP 是跨平台的,大部分现代的 C/C++ 编译器都支持 OpenMP。OpenMP 在一定程度上对并行算法进行了抽象,因此它使用起来很方便,程序员可以简单地通过编译器指令#pragma omp去控制程序的行为。
OpenMP 的语法很简单,它看起来是这样的:
1#pragma omp <directive> [clause[[,] clause] ...]
最常见的指令应该算是parallel指令了,紧接在par ...
Android之性能监控框架
[TOC]
概述文章参考:https://geek-docs.com/vulkan/vulkan-tutorial/vulkan-tutorial-index.html
概述Vulkan 教程,Vulkan是Khronos Group(OpenGL标准的维护组织)开发的一个新API,它提供了对现代显卡的一个更好的抽象,与OpenGL和Direct3D等现有api相比,Vulkan可以更详细的向显卡描述你的应用程序打算做什么,从而可以获得更好的性能和更小的驱动开销。Vulkan的设计理念与Direct3D 12和Metal基本类似,但Vulkan作为OpenGL的替代者,它设计之初就是为了跨平台实现的,可以同时在Windows、Linux和Android开发。甚至在Mac OS系统上,Khronos也提供了Vulkan的SDK,虽然这个SDK底层其实是使用MoltenVK实现的。
Vulkan 教程介绍了Vulkan的基础知识、理论分析、实战演练,内容通俗易懂,简明扼要,带你轻松入门 Vulkan。
函数加过返回的相关逻辑
[TOC]
概述文章参考:https://www.cnblogs.com/southcyy/p/10256378.html
文章参考:https://segmentfault.com/q/1010000005338630
函数返回值1.函数返回基础数据类型
1234int test (){ int a=1; return a;}
返回值时最简单的方式,它的操作主要在栈上,变量a在函数结束后会删除,为了返回a的值,系统会在内部建立一个临时变量保存a的值,以返回给调用该函数的表达式,调用结束后变量便不再存在。如果a是简单地数据类型也无所谓,不是很占用内存,如果a是大的自定义类型的数据,那么对a的复制将会占用比较大的内存。函数返回值是右值,不能进行运算符操作。
2.返回指针:
12345int *test2(){ int *b=new int(); *b=2; return b;}
返回指针是在C中除了返回值以外的唯一方式,根据函数栈的特性,也会产生复制,只是复制的是一个指针即一个地址,对于返回大型对象可以减少不少的资源消耗。但返回指针的 ...
std:move基本用法和理解
[TOC]
概述
C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了.
C++11 提供了std::move 函数来把左值转换为xrvalue, 而且新版的push_back也支持&&参数的重载版本,这时候就可以高效率的使用内存了.
对指针类型的标准库对象并不需要这么做.
std::move(t) 用来表明对象t 是可以moved from的,它允许高效的从t资源转换到lvalue上.
注意,标准库对象支持moved from的左值在moved 之后它的对象原值是有效的(可以正常析构),但是是unspecified的,可以理解为空数据,但是这个对象的其他方法返回值不一定是0,比如size().所以,moved from 之后的对象最好还是不要使用吧?(如有不正确理解,请告知)
对本身进行move,并赋值给本身是undefined的行为.
12std::vector<int> v = {2, 3, ...
Eigen3矩阵运算框架基础学习
[TOC]
概述文章参考:https://zhuanlan.zhihu.com/p/462494086
Eigen是一个C++语言中的开源的模板库,支持线性代数的运算,包括向量运算,矩阵运算,数值分析等相关算法。因为eigen只包含头文件,所以使用的话不需要进行编译,只需要在cpp文件开头写#include <Eigen>就好。
Eigen是C++中可以用来调用并进行矩阵计算的一个库,简单了说它就是一个c++版本的matlab包。
开源库安装直接安装apt-get方式(假设默认安装到/usr/local/include里(可在终端中输入locate eigen3查看位置),若实际中默认安装到了/usr/include的话,可以对应替换下面命令的相应部分)
12// Ubuntu系统sudo apt install libeigen3-dev
这种安装方式有一个缺点,因为apt包更新比较慢,安装的版本可能不是最新版,那么之后的一些依赖于eigen的库可能没有办法使用(如Sophus库要求必须选用3.3以上版本的eigen包) ...
深度学习之归一化基础学习
[TOC]
概述
归纳统一样本的统计分布性。归一化在 $ 0-1$ 之间是统计的概率分布,归一化在$ -1–+1$ 之间是统计的坐标分布。
无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测,且 sigmoid 函数的取值是 0 到 1 之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。
归一化是统一在 $ 0-1 $ 之间的统计概率分布,当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从而导致学习速度很慢。
另外在数据中常存在奇异样本数据,奇异样本数据存在所引起的网络训练时间增加,并可能引起网络无法收敛。为了避免出现这种情况及后面数据处理的方便,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于 0 或与其均方差相比很小。
为什么需要归一化
为了后面数据处理的方便,归一化的确可以避免一些不必要的数值问题。
为了程序运行时收敛加快。
同一量纲。样本数据的评价标准不一样,需要对其量纲化,统一评价标准。这算是应用层面的需求。
避免神经元 ...
Android性能优化之启动速度优化
文章参考:https://mp.weixin.qq.com/s/-3uY3aSF67xTzWEJsa7e-A
概述随着项目版本的迭代,App的性能问题会逐渐暴露出来,而好的用户体验与性能表现紧密相关。
那么第一篇文章我就从应用的启动优化开始,根据实际案例,打造闪电般的App启动速度,会直接影响留存和转化等核心数据。
启动是指用户从点击 icon 到看到页面首帧的整个过程,启动优化的目标就是减少这一过程的耗时。
启动过程比较复杂,在进程与线程维度,它涉及到多次跨进程的通信与多个线程之间的切换;在耗时成因维度,它包括 CPU、CPU 调度、IO、锁等待等多类耗时。虽然启动过程比较复杂,但是我们最终可以把它抽象成主线程的一个线性过程。因此对于启动性能的优化,就是去缩短主线程的这个线性过程。
开始,我们先说一下Android性能优化可以从哪些点去出发:
1、启动加速之主题切换。使用Activity的windowBackground主题属性来为启动的Activity提供一个简单的drawable。
2、避免在Application里面进行过度的初始化操作
3、启动加速之Diagnosing T ...
AspectJ在Android 的应用耗时统计
文章转自:https://mp.weixin.qq.com/s/EaHrD4A8TeADDPUQEoKb-g
概述AspectJ 是 Java 语言 AOP(面向切面编程)的一种实现方案。
AspectJ 有两种实现方式:
使用 Java 语言和注解,然后通过 AspectJ 提供的编织器,编织代码到目标 class 文件;
直接使用 AspectJ 语言编写,然后使用 ajc 编译器用来编译 aj 文件,生成 java 标准的 class 文件。
AspectJ 语言的语法和 Java 一样,只是比 Java 语言多了一些关键字,但由于 Android Studio 并没有提供 AspectJ 语法的支持,所以在 Android 开发中使用 AspectJ 只能使用注解的方式来实现。
下面通过注解的实现方式来解释一些基本的概念。
基本概念Aspect(切面)一个切面是一个独立的功能实现,一个程序可以定义多个切面,定义切面需要新建一个类并加上 @Aspect 注解。
例如:SampleAspect 就是一个切面 ,这个切面实现了打印所有 Activity 中 onCreate() ...
Android性能优化之View绘制优化基础
文章参考:https://mp.weixin.qq.com/s/yU7ZUbZCUXGdpctic8qexw
概述绘制优化是指View的onDraw方法要避免执行大量的操作,这主要体现在两个方面:
1.onDraw中不要创建新的局部对象。
因为onDraw方法可能会被频繁调用,这样就会在一瞬间产生大量的临时对象,这不仅占用了过多的内存而且还会导致系统更加频繁gc,降低了程序的执行效率。
2.onDraw方法中不要做耗时的任务,
不能执行成千上万次的循环操作,尽管每次循环都很轻量级,但是大量的循环仍然十分抢占CPU的时间片,这会造成View的绘制过程不流畅。
按照Google官方给出的性能优化典范中的标准,View的绘制频率保证60fps是最佳的,这就要求每帧绘制时间不超过16ms(16ms = 1000/60),虽然程序很难保证16ms这个时间,但是尽量降低onDraw方法中的复杂度总是切实有效的。
Android性能优化之View布局优化
文章参考:https://developer.android.com/studio/profile/inspect-gpu-rendering#debug_overdraw
文章参考:https://www.jianshu.com/p/4f44a178c547
Android优化典范:https://www.youtube.com/watch?v=CaMTIgxCSqU
https://www.youtube.com/watch?v=T52v50r-JfE
Android应用就是将我们的UI布局渲染成界面展示给用户。用户和界面之间进行交互。所以界面的流畅度就非常重要。因此,有个良好的UI布局会对App的性能产生比较大的影响,如果布局写得糟糕,显而易见App的表现不可能流畅。就会使得应用比较卡顿,甚至出现丢帧的情况存在。
UI布局中有很多原因可以导致丢帧,这里列举一些常见的:
1、layout 太过复杂,层次过多,无法在16ms内完成渲染;
2、UI 上有层叠太多的绘制单元,过度绘制,使得某些像素被绘制多次。
3、CPU 或者 GPU 负载过重
4、同一时间内动画执行的次数过多,导致C ...