2014-09-11 131 views
1

我从一个类创建对象,并希望稍后迭代它们。有没有比这更有效的方法?通过类的迭代遍历对象

class1 = {} 
class1.value1 = "1" 
class1.value2 = 2 
class1.tvalue1 = {} 

function class1:new() 
    local class = self 
    local object = {} 
    setmetatable(object,class) 
    class.__index = class 
    object.tvalue1 = {} 
    table.insert(objects, object) -- to iterate them later, stupid way I think 
    return object 
end 
function class1:alterValue1(input) 
    self.value1 = input 
    return self.value1 
end 
function class1:alterValue2(input) 
    self.value2 = input 
    return self.value2 
end 


randomName = class1:new() 
otherName = class1:new() 
weirdoName = class1:new() 
. 
. 
. 
(n) 

是否有一个更有效的方法来迭代对象,而不是将它们插入到构造函数中的某种对象表中?

+0

我知道,在这个例子中思想被命名为坏方法,但它只是一个例子,你应该解决这个问题。 – Sempie 2014-09-11 06:14:27

+0

你为什么认为目前的方法效率不高? – 2014-09-11 06:16:54

+0

这样做只是感觉不好,......不知道为什么。 – Sempie 2014-09-11 06:18:04

回答

1

您使用的方法是将class1的每个“实例”插入名为objects的表中。如果要遍历class1的所有实例,即使用for循环对每个实例使用/进行操作,那么您没有选择,必须将实例存储在表中,就像您在做的那样。

接下来的问题是,该表是否存在对表现有影响?在Lua中,本地人(和upvalues)的访问比访问全局变量的性能稍微好一点,但是差异是否取决于你需要怎么处理全局变量,在迭代的情况下,你在本体迭代。例如参见Optimizing Using Local Variables

在极有可能的情况下,迭代循环体中的操作将会产生任何影响(在您的表是局部还是全局之间)无关紧要。你可能想看看What can I do to increase the performance of a Lua program?,但最重要的,只有基础上优化

  • 分析:使用os.clock,并可能像PepperFish - 买者自负:我还没有尝试过。
  • “声音设计”原则:仔细选择你的容器和算法,例如,如果你不注意你的设计,你可以得到O(N^2)而不是O(N log N),同样O(N log N)而不是O(log N),或者O(N)而不是O(1)等。