本文为我的个人经验分享视频Julia高性能代码入门流程相应的代码。

除了官方文档的性能建议必须知道的以外,总的来说有几个套路:

  1. 参数分类。

    • 物理常数直接默认全局变量,并声明const类型。Julia编译成静态语言的时候就不会害怕有别的程序会改动它,从而大幅提升性能。
    • 利用struct来打包机器参数,节省开发时间;
  2. 数组预先分配其在内存中的大小;
  3. 做好缓存。利用多重分派,避免循环矢量化操作的重复计算问题。
  4. 做好多线程。这个是提升最大的。
  5. 一个提醒。通常来说,数组for循环第一个index放最里面——因为它改动最频繁,而数组访问第一个index最快。但实际上,谁放外面谁放里面需要具体问题具体分析。只按照性能建议中的将第一个index放最内层未必最快。

数据生成

using BSON: @savezvec = randn(10000)*0.12
δvec = randn(10000)*1.06e-3@save "zvec_δvec.bson" zvec δvec

MATLAB代码

data = readtable("data.csv");
zvec = table2array(data(1:end, 1));
deltavec = table2array(data(1:end, 2));%%restenergy = 0.511e6;
clight = 3e8;nturns = 10001;
nparticle = length(zvec);v1 = 3.6395053705870048e+06;
v2 = 655751.6971214055228756;
r = v2/v1;
phi_s = 2.1575815005097385;
phi_2s = 6.0620746573056303;
h1 = 756;
h = 3;
circum = 1360.4;
centerenergy = 6e9;
alpha_c = 0.0000156;%% 10000个粒子相空间坐标,不保存历史tic;for i = 1:nturnsdeltavec = deltavec + v1/centerenergy * (sin(phi_s - 2 * h1 * pi / circum .* zvec) - sin(phi_s) + r * sin(phi_2s - 2 * h1 * h * pi / circum .* zvec) - r * sin(phi_2s));etavec = alpha_c - 1./(centerenergy/restenergy .* (1 + deltavec)).^2;zvec = zvec - circum .* etavec .* deltavec;
endtoc% %%
%
% tic;
%
% k1 = 2 * h1 * pi / circum;
% k2 = 2 * h1 * h * pi / circum;
% gamma = centerenergy/restenergy;
% c1 = v1 / centerenergy;
% c2 = sin(phi_s) + r * sin(phi_2s);
% c3 = 1/gamma^2;
%
% parfor j = 1:nparticle
%     for i = 1:nturns
%         deltavec(j) = deltavec(j) + c1 * (sin(phi_s - k1 * zvec(j)) + r * sin(phi_2s - k2 * zvec(j)) - c2);
%         eta = alpha_c - c3/(1 + deltavec(j))^2;
%         zvec(j) = zvec(j) - circum * eta * deltavec(j);
%     end
% end% toc%% 更新10000个粒子相空间坐标,同时保存历史tic;zmat = zeros(nparticle, nturns);
delta_mat = zeros(nparticle, nturns);
for i = 1:nturnsdeltavec = deltavec + v1/centerenergy * (sin(phi_s - 2 * h1 * pi / circum .* zvec) - sin(phi_s) + r * sin(phi_2s - 2 * h1 * h * pi / circum .* zvec) - r * sin(phi_2s));etavec = alpha_c - 1./(centerenergy/restenergy .* (1 + deltavec)).^2;zvec = zvec - circum .* etavec .* deltavec;zmat(1:end, i) = zvec;delta_mat(1:end, i) = deltavec;
endtoc

Julia代码

using BSON: @load@load "zvec_δvec.bson" zvec δvec# 物理常数
const restenergy = 0.511e6
const clight = 3e8# 计算参数
nturns = 10001# 机器参数
struct Par# 这些参数要提前准备v1::Float64v2::Float64ϕs::Float64ϕ2s::Float64h1::Int64h::Int64circum::Float64centerenergy::Float64αc::Float64# 这些参数会自动计算r::Float64
end
function Par(v1, v2, ϕs, ϕ2s, h1, h, circum, centerenergy, αc)Par(v1, v2, ϕs, ϕ2s, h1, h, circum, centerenergy, αc, v2/v1)
endfunction _revolution_cache(p::Par)c1 = p.v1/p.centerenergyc2 =  sin(p.ϕs) + p.r * sin(p.ϕ2s)c3 = 1/(p.centerenergy/restenergy)^2k1 = 2*p.h1*pi/p.circumk2 = 2*p.h1*p.h*pi/p.circum(; c1, c2, c3, k1, k2)
endfunction revolution_with_cache(z::Number, δ::Number, p::Par, c)δ = δ + c.c1 * (sin(p.ϕs - c.k1 * z) + p.r * sin(p.ϕ2s - c.k2 * z) - c.c2)η = p.αc - c.c3/(1+δ)^2z = z - p.circum * η * δz, δ
endfunction revolution_multithreads!(zvec::Vector, δvec::Vector, nturns::Int64, p::Par)c = _revolution_cache(p)nparticles = length(zvec)@sync @inbounds for i=1:nparticlesThreads.@spawn beginz, δ = zvec[i], δvec[i]@inbounds for j=1:nturnsz, δ = revolution_with_cache(z, δ, p, c)endzvec[i], δvec[i] = z, δendendzvec, δvec
endfunction revolution_singlethread!(zvec::Vector, δvec::Vector, nturns::Int64, p::Par)c = _revolution_cache(p)nparticles = length(zvec)@inbounds for j=1:nturns@inbounds @simd for i=1:nparticleszvec[i], δvec[i] = revolution_with_cache(zvec[i], δvec[i], p, c)endendzvec, δvec
endfunction revolution_history_1(zvec::Vector, δvec::Vector, nturns::Int64, p::Par)c = _revolution_cache(p)nparticles = length(zvec)zmat = zeros(eltype(zvec), nturns, nparticles)δmat = zeros(eltype(zvec), nturns, nparticles)@sync @inbounds for i=1:nparticlesThreads.@spawn beginz, δ = zvec[i], δvec[i]@inbounds for j=1:nturnsz, δ = revolution_with_cache(z, δ, p, c)zmat[j, i], δmat[j, i] = z, δendendendzmat, δmat
endfunction revolution_history_2(zvec::Vector, δvec::Vector, nturns::Int64, p::Par)c = _revolution_cache(p)nparticles = length(zvec)# 数组内存预分配zmat = zeros(eltype(zvec), nparticles, nturns)δmat = zeros(eltype(zvec), nparticles, nturns)ηvec = zeros(eltype(zvec), nparticles)tmpzvec, tmpδvec = zvec[:], δvec[:]@inbounds for i = 1:nturnstmpδvec .= tmpδvec .+ c.c1 .* (sin.(p.ϕs .- c.k1 .* tmpzvec) .+ p.r .* sin.(p.ϕ2s .- c.k2 .* tmpzvec) .- c.c2)ηvec .= p.αc .- c.c3 ./ (1 .+ tmpδvec) .^ 2tmpzvec .= tmpzvec .- p.circum .* ηvec .* tmpδveczmat[:, i] = tmpzvecδmat[:, i] = tmpδvecendzmat, δmat
endp = Par(3.6395053705870048e+06, 655751.6971214055228756, 2.1575815005097385, 6.0620746573056303, 756, 3, 1360.4, 6e9, 1.56e-5)

Julia个人流程演示代码相关推荐

  1. 【MM小贴士】从 purchase 到 payment 全流程演示

    作为MM顾问,采购订单基本都会操作的.但是作为MM顾问,不能只懂MM,采购业务作为供应链体系当中的重要一环,我们要承接财务的应付账款,采购对账,预付账款等诸多环节.如果对这些业务不理解,或者没有实际操 ...

  2. OpenCV演示代码以查找图像中的轮廓(附完整代码)

    OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 #include "opencv2/imgcodecs.hpp&quo ...

  3. OpenCV霍夫变换的演示代码(附完整代码)

    OpenCV霍夫变换的演示代码 OpenCV霍夫变换的演示代码 OpenCV霍夫变换的演示代码 #include "opencv2/imgcodecs.hpp" #include ...

  4. 【Go API 开发实战 3】API 流程和代码结构

    API 流程和代码结构 为了使读者在开始实战之前对 API 开发有个整体的了解,这里选择了两个流程来介绍: HTTP API 服务器启动流程 HTTP 请求处理流程 本小节也提前给出了程序代码结构图, ...

  5. php做一个微信退款,PHP实现微信申请退款流程实例代码

    前面讲了怎么实现微信支付,详见博文:php实现微信支付(jsapi支付)流程  和ThinkPHP中实现微信支付(jsapi支付)流程.由于业务需求,还需要有微信退款,经过研究和摸索,也终于搞定了. ...

  6. 一个SPS + K2 + InfoPath + Mobile + Exchange的工作流程演示系统

    前两个星期,投身在一个为客户做的工作流程演示项目中.项目的目标是在短时间内,演示构建一个能够体现移动设备优势的工作流系统. 项目中使用了SharePoint Portal Server 2003作为整 ...

  7. 十大经典排序算法(动态演示+代码)

    时间复杂度是指程序执行函数或方法的效率常用大写的O表示,比如执行一个循环我们记做O(n),执行一个加法运算或者执行一个if操作我们记为O(1)​. ​ 时间.空间复杂度比较 1 冒泡排序 算法思想: ...

  8. java安卓图片全屏_在Android中全屏显示GIF图片(演示代码)

    [实例简介] 在Android中全屏显示GIF图片(演示代码),详细内容请参考:http://blog.csdn.net/u012939909/article/details/77418173 [实例 ...

  9. python scrapy 基本操作演示代码

    python scrapy 基本操作演示代码 # -*- coding: utf-8 -*- import scrapy # from quotetutorial.items import Quote ...

最新文章

  1. 算法系列之二十:计算中国农历(二)
  2. py2与py3的区别
  3. 英特尔紧急召回SB主板,Intel 6系列芯片组设计缺陷
  4. 【完整示例】采用jenkins pipeline实现自动构建并部署至k8s
  5. 初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)
  6. Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET
  7. [Java2入门经典]第9章 访问文件和目录
  8. 海淀区第九届单片机竞赛获奖名单_第十二届程序设计竞赛暨ACM选拔赛获奖名单...
  9. LeetCode Two Sum
  10. c语言学习-猜数字游戏
  11. 安装过MongoDB(4版本)重新安装时出现错误Verify that you have sufficient privileges to start system services如何解决
  12. 酷狗、QQ音乐歌词转换工具
  13. 立创开源 | 恒温加热台
  14. B. Disturbed People(模拟) Codeforces Round #521 (Div. 3)
  15. pptpd mysql_pptpd+freeradius+mysql安装步骤
  16. 腾讯抖音搬运视频如何消重
  17. pygame-KidsCanCode系列jumpy-part14-背景音乐及音效
  18. 将数据库中的数据转换成json格式
  19. 解决Waiting for incoming connection with ide key xdebug错误
  20. oracle数据库description,DESCRIPTION=(ADDRESSOracle12c环境下的EM配置和使用方法

热门文章

  1. 用html制作的蚂蜂窝旅游网页设计,蚂蜂窝移动端的HTML5化 推两款新应用
  2. 惭愧,我这外行人错用了N年的CreateDIBSection
  3. c语言程序二级模拟试卷,C语言程序设计二级考试模拟题集.doc
  4. Qt实现窗口四周阴影
  5. Linux 安装Java JDK1.8
  6. DOC2PDF项目博客
  7. 数据多样性:涌现、概念及应用探索
  8. gradle安装与入门
  9. 函数指针和指针函数:超详解——函数指针形参
  10. 宝来客分享怎样才能让每一位导购主动成为金店的增长发动机