RSS

JavaScript 数组、Object对象for循环效率对比

2009年05月21日 | ghSky | 浏览: 1,241   

7 Comments

原来小航子(山山)跟我说过,多用object对象少用数组对象,因为object的效率要高一些,今天刚好在写一个JS的遇到了一个用数组还是用对象的问题,所以就简单写了测试页面。

详见:http://ghsky.com/demo/090521/test_js_for.html

实验内容:测试内容主要是for循环,因为一般数组都是用for循环来遍历数组元素,而object对象则应该用for..in循环来遍历对象元素,所以主要测试思路就是给object和数组填充大量元素,然后分别测试他们遍历、输出的消耗时间。

实验方法:简单说一下实施方法,首先通过一个随机生成字符串的函数(每次生成字符串长度在0-200个字符间),然后分别将生成字符串存到object对象和数组对象中(通常要生成1000个上述字符串),然后用innerHTML方法在页面中输出,计算遍历、输出时间。

说明:考虑用innerHTML方法输出是因为效率比DOM方法高很多,而且这种效率提高有助于高效检测,其次迭代输出的时候用了 innerHTML += 的方法,虽然这样效率很低,应该考虑用存到一个数组然后在.join('')生成字符串输出,但是考虑到将object转存数组也有大量时间消耗,所以索性就选择 innerHTML += 的方法输出。

警告:由于此测试页面计算量很大,容易造成浏览器占用较高CPU,同时浏览器假死现象也可能出现,因此在进行测试的时候请确保浏览器没有打开未保存页面或没有进行其他有可能造成损失的操作!

结论:1.经过几次简单的测试,发现通常情况下数组for循环效率要高于object for-in循环,且有时效率甚至高于50%以上,但是测试也发现,相反的结果页可能出现几次,但总体来看数组循环的效率是要高于object对象的for-in循环;
2.同时经过不同浏览器的测试,发现对于各浏览器的JavaScript引擎来说,Chrome 2的V8引擎最优秀,平均耗时很低,且假死现象轻微;其次是Opera,9.6它的速度和Chrome相对,稍慢一些,不过稳定性不如Chrome,过程中会出现“未响应”情况;第三应该是Safari 4 Beta,运算速度稍慢于Opera,但是较为稳定;第四应该归属IE8,运算速度慢于以上各浏览器,不过没有假死现象;最后是Firefox 3.0.10,速度最慢,通常比IE8还慢很多,有时比IE8慢达200%!!看来Firefox 3.0的JavaScript引擎仍需提高啊~

最后此种测试方法可能存在缺陷,欢迎各位DX拍砖,同时也欢迎各位博友在留言中回复两项测试的时间,谢谢~

利用 JSONP 进行 JavaScript 的跨域数据访问

2009年05月21日 | ghSky | 浏览: 704   

1 Comment

原文来自:http://hpyer.cn/visit-remote-data-with-jsonp-in-javascript.html

一、基础知识

  1、什么是 JSON:JavaScript Object Notation (JSON) 是一种轻量级、基于文本、语言无关的数据交换格式。它是从 ECMAScript 语言标准衍生而来的。JSON为轻便的表示结构化数据,定义了一小套格式化规则。以下是一个 JSON 对象的例子:

  1. {
  2.     "Image": {
  3.         "Width": 450,
  4.         "Height": 561,
  5.         "Title": "Intel Core 2 Duo",
  6.         "Thumbnail": {
  7.             "Url": "http://www.example.com/image/...",
  8.             "Height": 125,
  9.             "Width": "100"
  10.         },
  11.         "IDs": [116, 943, 234, 38793]
  12.     }
  13. }

  2、什么是 JSONP:JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成 Script tags 返回至客户端,通过 Javascript callback 的形式实现跨域访问(这仅仅是 JSONP 简单的实现形式)。
阅读全文…

不同进制之间的转换的各种方法

2007年10月18日 | ghSky | 浏览: 2,898   

2 Comments

不同进制之间的转换纯粹是数学上的计算。不过,你不必担心会有么复杂,无非是乘或除的计算。
生活中其实很多地方的计数方法都多少有点不同进制的影子。

比如我们最常用的10进制,其实起源于人有10个指头。如果我们的祖先始终没有摆脱手脚不分的境况,我想我们现在一定是在使用20进制。

至于二进制……没有袜子称为0只袜子,有一只袜子称为1只袜子,但若有两袜子,则我们常说的是:1双袜子。

生活中还有:七进制,比如星期。十二进制,比如“一打”,六十进制,比如分钟……

一、为什么需要八进制和十六进制?

编程中,我们常用的还是10进制……必竟VB是高级语言。
比如:a = 99;
不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。但是二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制数表达将是:0000 0000 0000 0000 0110 0100
面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++ 没有提供在代码直接写二进制数的方法。
 
用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。不过,为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢?

2、8、16,分别是2的1次方,3次方,4次方。这一点使得三种进制之间可以非常直接地互相转换。8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。在下面的关于进制转换的课程中,你可以发现这一点。 阅读全文…

C#解决数学问题

2007年08月06日 | ghSky | 浏览: 841   

3 Comments

在VF看见的一个题目:
HOHO,占字符……

计算:1/2×3+1/3×4+1/4×5+.....1/99×100

写了个基本程序,不过无法实现分数显示结果

下载: solve1.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace Solve_1
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             int a = 2;
  12.             int b = 3;
  13.             float ans = 0;
  14.             while (b < = 100)
  15.             {
  16.                 float num1 = (float)a;
  17.                 float num2 = (float)b;
  18.                 ans =ans + 1 / num1 * num2;
  19.                 a++;
  20.                 b++;
  21.              }
  22.              Console.WriteLine(ans);
  23.         }
  24.     }
  25. }

阅读全文…

C#第三章练习3.9.4

2007年08月06日 | ghSky | 浏览: 766   

0 Comments

第三章的另一个练习
简单的加密

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace Chapter03Exercise394
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             Console.WriteLine("What do you want to do? Encrypt(E) Or Crack(C)");
  12.             string m = Console.ReadLine();
  13.             if (m == "E" || m == "e")
  14.             {
  15.                 Console.WriteLine("Please input what you want to encrypt");
  16.                 string str1 = Console.ReadLine();
  17.                 int count1 = str1.Length;
  18.                 for (int i = 0; i < count1; i++)
  19.                 {
  20.                     char temp1 = str1[i];
  21.                     int pass = (int)temp1;
  22.                     pass = pass + 5;
  23.                     char temp2 = (char)pass;
  24.                     Console.Write(temp2);
  25.                 }
  26.                 Console.ReadLine();
  27.             }
  28.  
  29.             else if (m == "C" || m == "c")
  30.             {
  31.                 Console.WriteLine("Please input what you want to crack");
  32.                 string str2 = Console.ReadLine();
  33.                 int count2 = str2.Length;
  34.                 for (int i = 0; i < count2; i++)
  35.                 {
  36.                     char temp1 = str2[i];
  37.                     int pass = (int)temp1;
  38.                     pass = pass - 5;
  39.                     char temp2 = (char)pass;
  40.                     Console.Write(temp2);
  41.                 }
  42.                 Console.ReadLine();
  43.             }
  44.             else
  45.             {
  46.                 Console.WriteLine("Input Error!!!");
  47.                 Console.ReadLine();
  48.             }
  49.         }
  50.     }
  51. }
Page 1 Of 3123