- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
var s = '', ok = ' h dfb ds84 78sgf ydf hjb////**', lc = 0, cc = 0
for (var i = 0; i < 300000; i++) {
s += ok[Math.floor(Math.random() * ok.length)]
}
console.time('[]')
for (var i = 0; i < s.length; i++) {
if (s[i] == '/' && s[i+1] == '/') lc++, i++
if (s[i] == '/' && s[i+1] == '*') cc++, i++
}
console.timeEnd('[]')
/*
console.time('charAt')
for (var i = 0; i < s.length; i++) {
if (s.charAt(i) == '/' && s.charAt(i+1) == '/') lc++, i++
if (s.charAt(i) == '/' && s.charAt(i+1) == '*') cc++, i++
}
console.timeEnd('charAt')
*/
console.time('regex')
var rlc = (s.match(/\/\//g) || []).length;
var rcc = (s.match(/\/\*/g) || []).length;
console.timeEnd('regex')
console.log(lc, cc, rlc==lc, rcc==cc)
为什么 str.charAt() 始终比 str[] 表现出约 1.6 的性能提升?他们不应该以同样的方式做同样的事情吗? [] 是否做了一些影响速度的额外检查或转换?还是与我的代码有关?
此外,为什么 str.charCodeAt(i) == 42
比 str.charAt(i) == '/'
还要快 10%?从 C/C++ 的 Angular 来看,这完全没有意义。
更新:我将整个测试代码放在这里。
更新2:我必须说这是使用 Node.js 版本 0.11.4 观察到的
http://jsperf.com/brackets-vs-charat3此测试用例显示较小的差异。 charAt() 在 chrome 37 中慢 6%,在 Firefox 33 中快 1%。所有 Ubuntu 64。
更新3,因为这似乎是Node.js问题,所以我添加了node.js标签
最佳答案
Aren't they supposed to do the same thing the same way?
没有。除了明显不同的方式之外,他们做的事情并不相同。检查spec for charAt
和 for []
on strings .
Does [] do some extra checks or conversions that affect speed?
显然。不同之处在于 charAt
需要将其操作数转换为字符串,而 []
不需要这样做。此外,对于越界访问,charAt
将返回空字符串,而 []
将返回 undefined。大多数情况下,[]
需要检查给定的属性名称是否确实是一个整数,以及字符串对象上是否存在具有该名称的实际属性。
Or is it rather about my code?
您的代码看起来不错。
Furthermore why str.charCodeAt(i) == 42 is another 10% faster than str.charAt(i) == '/'? From C/C++ point of view it makes no sense at all.
请注意,JavaScript 没有 char
数据类型。 '/'
是一个长度为 1 的字符串。看起来这没有很好地优化(或者:很容易),并且整数1比较是只是比字符串比较快。
1:大多数数字,尽管“按照规范”是 64 位 float ,但在 V8 中表示为 31 位整数。
关于javascript - 为什么 Node.js 中 str.charAt(i) 比 str[i] 快 1.6 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27144918/
String dirtyStr = "Who. do yo$u th,ink you are?!"; System.out.println(scrub(dirtyStr));
我理解下面的代码计算名称字符串中每个字母出现的次数。 String name = "haier"; int[] count = new int[256]; for (int i = 0; i < na
我正在制作一个字母计数程序。有没有一种方法可以使用 1 个 case 来增加字符串中的字母数量,而不是使用 26 个 case。是否可以简化这个程序? import javax.swing.JOpti
我正在开发韩语名字的罗马化器,但我被困在这里,因为它不是从 A 到 B 的简单音译,而是更复杂的一个: 名称通常由3个音节组成(在JavaScript中被识别为3个字符),姓氏是第一个,后面通常是由2
https://jsfiddle.net/2L4t9saq/180/ 是我的 fiddle 大部分代码都是无用的,我只是发布重要的内容 var baseConverter = function(r,
我现在正在学习 Dart,我想知道如何在字符串中找到字母。我试过使用 charAt() ,但随后 Dart 编辑器说: Class 'String' has no instance method 'c
我打算制作一个简单的程序,该程序将接受用户输入,并在每个字母之间放置空格。例如,用户输入 mall,它返回 M A L L(在同一行)。我正在尝试使用 if 语句创建一个循环。但我认为我需要 Char
我正在编写java代码,想知道为什么这段代码的输出是x。我本来期待 t,因为它是第 5 个字母。 public class StringBufferDemo{ public static vo
快速提问。我在程序中有这段代码: input = JOptionPane.showInputDialog("Enter any word below") int i = 0; for (int j
我正在做一个分配,它接受两个无限的未分配整数(表示为字符串),并将它们相加。我的 add 方法让我感到悲伤。我不断收到此错误,但不知道为什么。 这是给我带来麻烦的代码部分: for(int i = 0
我编写了一个小程序,其中有一个带有字符串名称的二维数组。在嵌套的 for 循环中,我检查数组每个元素中的第一个字符。如果第一个字符是“A” || 'E' || ‘我’|| 'O'|| 'U',我使用
我试图找出“哪个 5 位数字乘以 4 可以得到它的倒数?”使用此代码但出现错误: Exception in thread "main" java.lang.StringIndexOutOfBounds
我正在审查一个尝试确定字符串中的所有字符是否唯一的问题。这是算法 public static boolean unique(String s) { if(s.length() > 128) {
我的代码遇到一些问题,我正在尝试测试 char 中的位置是否等于整数。我的设置方式如下: for(int i = 0; i < str.length(); i++) { if(
下面是我的简单程序,它将字符串转换为数组元素,charAt(i) 没有返回根据文档应该返回的内容。我的代码是 public class StringToArray { public stati
我正在编写一种编程语言,在 javascript 中分号是分号,而我的是斜杠。 代码如下: document.getElementsByTagName("input")[0].addE
我正在使用以下函数获取 Google map 上的海拔高度: function getElevation(event) { var locations = []; var clicke
程序的这一部分给我带来了麻烦。该文件正在被程序正确接收。没有 charAt 方法程序运行完美。我不太确定问题出在哪里。显然这不是整个程序,只是给我一个错误的部分。 错误: java.lang.Stri
现在这段代码在一台机器上工作得很好,但在另一台机器上只是简单地拒绝输出正确的结果。 这是一个简单的 Initials 输出请求。我对代码没有疑问,但我的问题是为什么它输出数字而不是字母? 当使用 Ec
我正在尝试将字符串拆分为两个字符的 block 。然后我想找到这两个字符在字符数组中的位置。我如何在 Java 中执行此操作 for (int i = 0; i < message.lengt
我是一名优秀的程序员,十分优秀!