十一月 19th, 2011

错位交换算法被pass

前端开发, 数据结构、算法, by army.

上篇。尽管已经降到了十万分之一级别的几率,但并发下浏览器的不靠谱行为依旧存在。IE6-8下依旧为主要因素,这与使用者人数多也有关,基数大所以数量高。另外2次幂延迟算法对于单线程情况(aA)是能够完全纠正的,这点值得欣慰。

并发时,abAB、aABb、aAbB、ABba、abBA、AbBa、aBbA、aBAb几种情况按几率依次递减,想要完美解决必须全部纠正。在2次幂延迟算法纠正后,前面3个已经正确,但后面的还是错误的,它们可以统一概括为:ABba。结果原本应该赋给A的a跑到B的身上,互相错位了,所以要进行错位交换。

理论上前期不可能再进行处理了,我耗了很久发现前期处理是个悖论,剩下的可能只有运行时决定。

在运行时:

use(['a', 'b'], function(a, b) {
	a.methodA();
	b.methodB();
});

在错位情况下,a不具有methodA方法b才具有,b也反之。此时会抛异常。简单的做法是运行时try,捕捉到异常后交换错位的arguments再运行一次。看起来似乎不错,实际陷阱重重。

首先methodA和methodB可能方法名相同,甚至逻辑极为相似。这样就不会异常但运行结果是错的。这个概率很低。

然后这是在2个参数的情况下,2个以上排列比例太多,交换次数很恐怖,不切实际。

还有这只有1级递归,也就是a和b互相颠倒而已。如果a有依赖或b有依赖,所造成的错位可能有很多,那它们之间互相递归交换非常恐怖,根本不可能实现。

即使可以通过的define进行包裹一层,抽出factory返回的方法名来提升判断callback的参数顺序准确度,但依然不能解决上述所有问题。所以最后错位交换算法被pass。

IE下,通过getInteractiveScript的方法,可能提升并发准确度到百万分之一的级别,有待验证。

Back Top

回复自“错位交换算法被pass”

  1. 没有任何评论。
  1. 没有任何引用。

发表回复

Back Top