面试题答案
一键面试性能优化思路
- 延迟计算:使用惰性求值的迭代器(如
lazy
),避免一次性处理整个数据集,而是在真正需要结果时才进行计算。 - 减少中间数据存储:尽量避免创建大量中间数组或数据结构,直接在迭代过程中处理数据。
- 并行处理:对于多核系统,可以考虑使用并行迭代器(如
parallel
库)来充分利用多核优势,加快处理速度。
核心代码示例
# 假设自定义对象类
class MyObject
attr_accessor :attr1, :attr2
def initialize(attr1, attr2)
@attr1 = attr1
@attr2 = attr2
end
end
# 模拟大数据集
big_array = Array.new(1_000_000) do |i|
MyObject.new(i, i * 2)
end
# 阈值
threshold = 500_000
# 使用lazy和块进行筛选和复杂操作
result = big_array.lazy.select do |obj|
obj.attr1 > threshold
end.map do |obj|
# 复杂数学计算示例
obj.attr1 * obj.attr2
end.to_a
性能瓶颈及避免方法
- 内存占用:
- 瓶颈:如果不使用
lazy
,一次性处理大数据集可能导致内存占用过高,甚至内存溢出。 - 避免方法:如上述代码使用
lazy
进行惰性求值,只有在调用to_a
时才会将结果加载到内存中。
- 瓶颈:如果不使用
- CPU 利用率:
- 瓶颈:如果数据处理的计算量非常大,单线程处理可能会使 CPU 长时间处于忙碌状态,导致系统响应缓慢。
- 避免方法:使用并行处理库(如
parallel
库),示例代码如下:
require 'parallel'
# 使用parallel库并行处理
result = Parallel.map(big_array.select do |obj|
obj.attr1 > threshold
end) do |obj|
obj.attr1 * obj.attr2
end
这样可以充分利用多核 CPU 的优势,提高处理速度。但需注意,并行处理可能引入额外的线程或进程管理开销,对于过小的数据集可能得不偿失。