使用javascript计算器提高速度和数据效率。

时间:2013-02-14 03:50:09

标签: javascript jquery jquery-mobile performance

我正在构建一个javascript计算器(使用jquery mobile),以简化显微镜中的常规计算。我正在寻找创建更高效​​的代码并且喜欢任何输入...我不希望任何人挖掘整个事情,但这里是该程序的链接供参考:http://www.iscopecalc.com

(计算器的javascript位于http://www.iscopecalc.com/js/calc.js

计算器基本上由用户可以设置的大约12个输入组成。使用从这些输入接收的值,计算器生成大约15个不同参数的值,并在显示中输出结果。目前,每当输入状态发生变化时,我都会将该更改事件绑定到一个快速函数,该函数将该输入的值写入cookie。但程序的主要功能是“updateCalc()”函数,该函数从所有输入(从存储的cookie)中读取值,然后重新计算要显示的每个参数并输出它们。为了便于访问,我在这里只处理了这个功能:

function updateCalc(){

readValues();       //load current calculator state into cookies
var data = $.cookie();  //puts all cookie data into object

var fluorData = fluoroTable[data['fluorophore']];  //fluorophore data taken from table at the end of the file depending on chosen fluorophore
    var fluorem = fluorData['fluorem'];
    var fluorex = fluorData['fluorex'];
var cameraData = cameraTable[data['camera']];   //camera data taken from table at the end of the file depending on chosen camera
    var campix = cameraData['campix'];
    var chipWidth = cameraData['chipWidth'];
    var chipHeight = cameraData['chipHeight'];
    var chipHpix = cameraData['chipHpix'];
    var chipVpix = cameraData['chipVpix'];


var RefInd = data['media'];         //simple variables taken directly from calculator inputs
var NA = data['NAslider'];
var obj = data['objective'];
var cammag = data['cameraRelay'];
var CSUmag = data['CSUrelay'];
var bin = data['binning'];

var pinholeRad;
var FOVlimit;
var mode;

if (data['modality']=='widefield'){     //FOVlimit, pinholeRad, and CSU mag will all depend on which modality is chosen
    FOVlimit = 28;
    pinholeRad = NaN;
    mode = 'Widefield';
    CSUmag = 1;
}
else if (data['modality']=='confocal'){
    if (data['CSUmodel']=='X1'){
        pinholeRad = 25;
        if(data['borealis']=='true'){
            mode = "Borealis CSU-X1";
            FOVlimit = 9;
        }
        else {
            mode = "Yokogawa CSU-X1";
            FOVlimit = 7;
            CSUmag = 1;
        }
    }
    else if (data['CSUmodel']=='W1'){
        mode = "Yokogawa CSU-W1";
        FOVlimit = 16;
        pinholeRad = data['W1-disk']/2;
        CSUmag = 1;
    }
}

//These are main outputs and they depend on the input variables above

var latRes = 0.61 * fluorem / NA;
var axRes = 1.4 * fluorem * RefInd / (NA*NA);
var BPpinhole = 1000 * pinholeRad / (obj * CSUmag);
var AU = BPpinhole / latRes;
var totalMag = obj * cammag * CSUmag;
var BPpixel = 1000 * campix * bin / totalMag;
var samples = latRes / BPpixel;
var pixperpin = BPpinhole * 2 / BPpixel;
var sampLit = 1000 * FOVlimit / (obj * CSUmag);
var coverage = FOVlimit * cammag / chipHeight;
if (coverage < 1) {
            chipUsed = coverage;
            FOV = sampLit;
        }   
        else {
            chipUsed = 1;
            FOV = sampLit * chipHeight / (FOVlimit * cammag);   
        }
var sampWaste = 1 - FOV / sampLit;
var imgpix = 1000 * FOV / (chipVpix / bin);

//function goes on to update display with calculated values...
}

它运作正常,我对结果感到满意,但这是我想要的建议:

每个输入变量只影响少数输出(例如,输入#3的变化只会真正改变一些输出的计算...不是全部15),但是,我的功能无论相关性如何,每次更改任何输入时都会重新计算所有输出...我已经考虑过制作一个巨大的If-Then函数,该函数将根据已更改的输入有选择地仅更新可能已更改的输出。这显然需要更多的代码,但我想知道(一旦加载)代码在使用计算器时会更快,如果它只是浪费我的时间并使我的代码混乱。

我也想知道将输入存储在cookie中以及从cookie中读取值是否是一种合理的处理方式,如果我应该创建一个全局变量而不是存储计算器的状态。 (cookie具有存储用户计算器状态以供以后访问的额外好处)。

我对这些东西很陌生,所以对我如何提高代码效率的任何和所有评论都会非常感激(可以随意链接到我应该阅读的页面,或者我应该使用的方法例如使用...)

如果你已经做到这一点,感谢你的时间!!

0 个答案:

没有答案