我在JavaScript中发现了一个有趣的异常现象.其中心是我尝试通过预先计算sin(x)和cos(x)来加速三角变换计算,并简单地引用预先计算的值.
直觉上,人们会期望预计算比每次计算Math.sin()和Math.cos()函数更快.特别是如果你的应用程序设计只对trig函数的参数使用一组有限的值(在我的例子中,在[0°,360°]区间内的整数度数,这对我的目的来说已经足够了).
所以,我做了一点测试.在预先计算sin(x)和cos(x)的值,将它们存储在360元素数组中之后,我编写了一个简短的测试函数,通过简单的测试HTML页面中的按钮激活,来比较两者的速度.方法.一个循环简单地将值乘以预先计算的数组元素值,而另一个循环将值乘以Math.sin().
我的期望是预先计算的循环明显快于涉及对trig函数的函数调用的循环.令我惊讶的是,预先计算的循环速度较慢.
这是我写的测试函数:
function MyTest()
{
var ITERATION_COUNT = 1000000;
var angle = Math.floor(Math.random() * 360);
var test1 = 200 * sinArray[angle];
var test2 = 200 * cosArray[angle];
var ref = document.getElementById("Output1");
var outData = "Test 1 : " + test1.toString().trim() + "<br><br>";
outData += "Test 2 : "+test2.toString().trim() + "<br><br>";
var time1 = new Date(); //Time at the start of the test
for (var i=0; i<ITERATION_COUNT; i++)
{
var angle = Math.floor(Math.random() * 360);
var …Run Code Online (Sandbox Code Playgroud) 这确实让我很困惑。
我有一段监听 AJAX 事件的代码,所有这些事件都按计划运行,但有一个让我觉得奇怪的怪癖。也就是说,如果我将错误事件侦听器附加到 AJAX XMLHttpRequest 对象,并且在该对象上触发错误事件,则错误事件处理程序会收到 ProgressEvent 对象,该对象不包含任何有用的错误信息。
我的直觉告诉我,应该发送到错误事件处理程序的是一个 ErrorEvent 对象。但这并没有发生。
考虑到这种奇怪的现象,我如何检测实际发生的 AJAX 错误?我还想问,从不提供错误信息的错误事件处理程序有什么意义?
如果存在某种将 ProgressEvent 对象传递给 AJAX 错误事件处理程序的基本原理,那么我也非常希望对此进行解释。
我正在编写自己的自定义 node.js 服务器。它现在处理静态页面、AJAX GET、POST 和 OPTIONS 请求(后者用于 CORS),但我知道我为运行服务器端 GET 和 POST 脚本选择的方法不是最佳的 - 官方 node.js文档指出,启动大量子 node.js 进程是一个坏主意,因为它是一种资源匮乏的方法。它有效,但我知道可能有更好的方法来实现相同的结果。
所以,我来到了 VM 模块。我的第一个想法是这将解决机器与子进程混乱的问题,并使我的服务器更具可扩展性。
有一个小问题。我的服务器端脚本,对于诸如目录列表和将结果发送回浏览器之类的任务,从几个require语句开始以加载所需的模块。
最终编写了读取脚本文件的代码并将其传递给 vm.Script() 后,我现在遇到了一个错误:
“参考错误:要求不是一个函数”
我后来了解到,这样做的原因是 VM 为脚本启动了一个裸 V8 执行环境,而不是一个独立的 node.js 执行环境。为了让我的想法奏效,我需要 VM 为我提供一个单独的沙盒 node.js 执行环境。我如何实现这一目标?
我的初步研究告诉我,我需要提供虚拟执行环境与node.js的全局自身的单独副本,以便需要发挥预期的作用。我刚才提供的理解是否正确?如果是这样,我需要采取哪些步骤来执行此任务?