好吧,也许不是最好的头衔,但我缺乏灵感,所以去:
比方说,当随机用户与服务器交互时,您有一个“全局”(不是真的)变量来存储临时数据和子数据。通常,在与服务器的第一次交互中,main变量是不确定的,因此您需要处理这种情况。
现在,令我感到困惑的是,如果有很多用户并且很多方式与变量进行更多交互,那么执行此操作的最佳实践是什么?
困惑吗?是的,我知道,文字不是我的强项,所以让我向您展示代码
所以你有
var_dump($testArr)
然后是处理用户交互以存储数据的功能
array (size=2)
'feeling' => string 'love' (length=4)
'inverse' => string 'hate' (length=4)
3 => int 300
现在,在第一次交互时,user_data [uid] [data_name]是未定义的,所以它是user_data [uid]
我知道您可以通过以下两种方式进行处理:
使用if -
Array
使用try / catch
CURRENT_PRIVILEGESET
if是否会检查每个交互,就像我说的那样,有很多。 尝试捕获将触发一次,但需要付出一定的代价(afaik)
哪个更好?还是有另一种更好的方法
答案 0 :(得分:1)
@Nertan, 您的证明中有一部分:P。我对三元方式做了些微调整(与if方式中的执行顺序相同)。有了这个,您可以得出结论。
//var present = require('present');
function test(val,ud,fun) {
var k = 10000000;
var t = Date.now();
for(var i=0; i<k;i++)
{
var uid = Math.ceil(Math.random()*1000);
fun(uid,ud,"value");
}
var tf = Date.now()-t;
return tf;
}
function setValue_Opp(uid,ud,value)
{
(!ud[uid] && (ud[uid] = {})) && (ud[uid].value = value);
}
function setValue_Try(uid,ud,value)
{
try{ ud[uid].value = value}
catch(e){ ud[uid] = {}; setValue_Try(uid,ud,value)};
}
function setValue_Cond(uid,ud,value)
{
if(!ud[uid]) ud[uid] = {}
ud[uid].value = value;
}
var k1=0;
var k2=0;
var k3=0;
for(var i=0;i<10;i++){
k1+=test(1,{}, setValue_Cond);
k2+=test(2,{}, setValue_Try);
k3+=test(3,{}, setValue_Opp);
}
console.log(k1,k2,k3)
答案 1 :(得分:0)
我觉得我们可以利用以下ES6三元组:
; expected
答案 2 :(得分:0)
好,所以我不得不重写测试,因为它在代码段中无法正常工作
所以我为node.js做这个:
var present = require('present');
function test(val,ud,fun) {
var k = 10000000;
var t = present();
for(var i=0; i<k;i++)
{
var uid = Math.ceil(Math.random()*1000);
fun(uid,ud,"value");
}
var tf = present()-t;
console.log("END "+val+" at "+tf);
return tf;
}
function setValue_Opp(uid,ud,value)
{
(ud[uid] || (ud[uid] = {})) && (ud[uid].value = value);
}
function setValue_Try(uid,ud,value)
{
try{ ud[uid].value = value}
catch(e){ ud[uid] = {}; setValue_Try(uid,ud,value)};
}
function setValue_Cond(uid,ud,value)
{
if(!ud[uid]) ud[uid] = {}
ud[uid].value = value;
}
var k1=0;
var k2=0;
var k3=0;
for(var i=0;i<10;i++){
k1+=test(1,{}, setValue_Cond);
k2+=test(2,{}, setValue_Try);
k3+=test(3,{}, setValue_Opp);
}
console.log(k1,k2,k3)
最后: 3244.328997004777 3695.0267750024796 3437.6855720058084
意思是:
最好的是经典的
第二好的是常规运算符方法
最糟糕的是尝试捕获
所以经典似乎胜利了
编辑:
借助@CRayen进行进一步的测试,最好的方法是:
(!ud[uid] && (ud[uid] = {})) && (ud[uid].value = value);