【问题标题】:array versus switch advantages阵列与开关的优势
【发布时间】:2014-02-20 18:32:22
【问题描述】:

这是一个与javascript switch vs loop on array 略有相似的问题,但有所不同。比较

function Function1 (n) {
  switch (n) {
    case 0:
      return "apple";
    break;
    case 1:
      return "pear";
    break;
    // and a few more, or many more
  }
}

var Array2 = ["apple", "pear"]; // and more

然后根据需要调用或引用。第二个更整洁,但它有什么重要的缺点,不仅在速度方面,而且在内存使用方面?如果数组中有更多案例/元素,答案会发生很大变化吗?您的答案是特定于 Javascript 还是编程的一般原则?谢谢。

【问题讨论】:

  • 数组查找与 Object 查找相同,后者(在大多数实现中)使用哈希表完成,因此它非常快具有大型结构。这与switch 不同,后者实际上与一系列ifs 相同
  • 如果您需要访问索引上的数据,请使用结构访问索引上的数据。为什么要跳过多个条件或让编译器优化查找并混淆代码?
  • 谢谢。没有理由,只是不知道它是否有任何隐藏的优势。 :)

标签: javascript arrays switch-statement


【解决方案1】:

我将作为编程的一般原则来回答:

(1) 数组将所有字符串存储在其整个范围内的内存中,或者以手动分配内存的 C/C++ 等语言存储,直到显式释放内存。对于大型数组,这可能会占用大量内存。

(2) 与 switch() 不同的是,添加对象是在恒定时间内发生的,在数组的开头或中间添加或删除对象将需要将所有后续元素重新复制到它们的新位置。如果数组需要增长,可能需要重新复制所有对象,因为数组作为数据结构具有固定数量的元素,如果没有空间,增长数组将需要声明和重新初始化新数组的元素离开了。

(3) 对于查找,switch() 发生在线性时间,而数组查找发生在更快的常数时间内。

【讨论】:

  • 不知道交换机在内存使用方面比数组有优势。代码也占用空间。开关案例中引用的字符串也必须存储。
  • 好点。但是,数组将字符串存储在内存中的连续位置,如果数组很大,这可能会出现问题。另一方面,switch case 的存储取决于编译器。
  • 如果您的数据变得如此庞大,您最好还是将其放入数据库中。
【解决方案2】:

不久前,我创建了这个 jsperf 来比较 switch 和其他方法。在 chrome 中切换很慢:

http://jsperf.com/bmcgin-switch-vs-if-vs-obj

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多