我认为代码(如下)已经优化(只需使用比相同逻辑的初始版本更少的变量)
>
在优化过程中,我应该考虑哪些因素?
这是代码(也在jsfiddle上)
function process(arr){
var processed = [];
for(var i=0,len=arr.length;i<len;i++){
if(processed.indexOf(arr[i]) < 0){
var nodes = findIndexes(arr,arr[i]);
if(nodes.length > 1){
for(var j=0,jlen=nodes.length;j<jlen;j++){
arr[nodes[j]] = arr[nodes[j]] + '(' + ( j + 1 ) + ')';
}
}
processed.push(arr[i]);
}
}
return arr;
}
function findIndexes(arr,val){
var node = [];
for(var i=0,len=arr.length;i<len;i++){
if(arr[i] === val){
node.push(i);
}
}
return node;
}
// input
var arr = ['aa','bb','bb','aa','cc','dd','cc','ff']
console.log(process(arr));
//output: ["aa(1)", "bb(1)", "bb(2)", "aa(2)", "cc(1)", "dd", "cc(2)", "ff"]
这是代码的解释。“处理”函数在数组中查找相同的值,对于每个相同的值,它通过将一个数字挂起到该值来更改值,“数字”表示它在数组中找到的值的计数。
例如arr=["x","x","y","z"]将返回["x(1)","x(2)","y","z"]"y"和"z"不变,因为它们只出现过一次。
为了优化,我使用了一个名为已处理的数组,用于保存刚刚在main for循环中处理的值,因此在下一次迭代中可以确定通过检查array.indexOf方法,新的迭代值是否已经被处理,如果该值已经被处理,那么它可以安全地跳过底层逻辑(if/for语句)。
现在除了改变整个过程逻辑之外,我不知道如何进一步优化它。
还有一种以更少的更改优化代码的方法:
在您的特定情况下,您将遍历每个新找到的条目的整个数组,尽管之前的所有条目都已被处理,因此应该可以通过将当前索引传递给FindIndex来进一步优化:
function findIndexes(arr,val, fromIndex){
var node = [];
for(var i=fromIndex,len=arr.length;i<len;i++){
if(arr[i] === val){
node.push(i);
}
}
return node;
}
您可以在单个循环中完成:
function process2(arr) {
var out = arr.slice(0),
seen = {},
len = arr.length,
i, key, item, count;
for (i = 0; i < len; ++i) {
key = out[i];
item = seen[key];
if (!item) {
// firstIndex, count
seen[key] = item = [i, 0];
}
count = ++item[1];
if (count > 1) {
if (count === 2) {
out[item[0]] = key + '(1)';
}
out[i] = key + '(' + count + ')';
}
}
return out;
}
// input
var arr = ['aa', 'bb', 'bb', 'aa', 'cc', 'dd', 'cc', 'ff']
console.time('p2');
console.log(process2(arr));
console.timeEnd('p2');
从基准测试来看,流程2大约比流程1快2倍。这只是一个真正天真的问题的第一步。
广义的优化将涉及简化代码、预计算重复重用的结果,以及组织代码以便重用更多的结果。
您的fiddle代码在分析时产生了以下结果。
Logical LOC: 26
Mean parameter count: 3
Cyclomatic complexity: 7
Cyclomatic complexity density: 27%
Maintainability index: 104
代码行数(LOC)–表示代码中的大致行数。计数基于IL代码,因此不是源代码文件中的确切行数。非常高的计数可能表示某个类型或方法正在尝试执行太多的工作,应该进行拆分。它还可能表明该类型或方法可能很难维护。
可维护性指数–计算一个介于0和100之间的指数值,表示代码维护的相对容易程度。高值意味着更好的可维护性。颜色编码评级可用于快速识别代码中的故障点。绿色等级介于20和100之间,表示代码具有良好的可维护性。黄色评级介于10和19之间,表示代码具有适度的可维护性。红色等级是介于0和9之间的等级,表示可维护性低。
圈复杂度–衡量代码的结构复杂度。它是通过计算程序流中不同代码路径的数量来创建的。具有复杂控制流的程序将需要更多的测试来实现良好的代码覆盖率,并且维护性较差。
使用javascript代码的在线工具检查代码的复杂性。
参考:链接1,链接2
Javascript优化程序页面
参考(为您提供优化时应牢记的不同技巧)
如何在PHP Smarty中优化这段代码? 现在我有一个代码让我困惑,有一个简单的代码。 当我搜索需要推送值的代码时。 优化如何发挥作用?我能写到数组吗?如果它可以写入数组,我该怎么办?
了解如何在 Dreamweaver 中清除代码、检查浏览器兼容性、验证 XML 文档并使页面符合 XHTML 规范。 清理代码 您可以自动删除空标签,合并嵌套 font 标签,以及通过其它方法改善杂乱或难以辨识的 HTML 或 XHTML 代码。 有关如何清理从 Microsoft Word 文档生成的 HTML 的信息,请参阅打开和编辑现有文档。 在打开的文档中,选择“工具”>“清理 HTML”
问题内容: 我正在使用此代码来检测图像中的绿色。 问题在于此迭代确实很慢。 如何使其更快?如果使用的是numpy,如何以numpy的方式进行? 问题答案: 简单尝试一下:
JavaScript代码优化 1、慎用全局变量 为什么要慎用全局变量原因如下 1、全局变量定义在全局执行上下文,是所有作用域链的顶端 2、全局执行上下文一直存在于上下文执行站,直到程序退出 3、如果某个局部作用域出现了同名变量则会遮蔽或污染全局 2、缓存全局变量 其实就是在程序执行过程中,将使用中无法避免的全局变量缓存到局部 代码演示如下 1、普通写法: function getBt
如何将两个方法合并成一个方法 如图parentValues = ['BC', 'BC-SRV', 'BC-SRV-COM'], 想得到的是选中的树组arrSelectedFacets = ['BC-SRV-COM-FTP', 'BC-SRV-COM-TEL'] 如果 BC-SRV-COM 下的子节点都选中,则arrSelectedFacets=['BC-SRV-COM']
因为 a.pinyin[0] 的原因,我不知道怎么用 a[..] 的方式简化代码 谢谢