我目前需要优化一个太慢的算法的Scala实现.它以功能方式实现,仅使用values(val)和不可变数据结构.我已经记住了重要的函数(因此我的代码中有一些可变映射),这使得我的代码速度提高了一倍,我想知道下一步该做什么.
因此,我不是在寻找有关软件优化的通用建议(例如,首先优化您的算法,使用分析器,执行基准测试......),而是针对Scala特定或JVM特定的优化建议.
因此,我的问题是在尝试优化Scala代码时首先要考虑的地方?通常导致减速的常见语言结构或模式是什么?
特别是,我正在就以下几点寻求建议:
for(...)构造很慢,因为每次执行循环体时都会生成一个匿名类.这是真的吗?是否有其他地方生成匿名类?(例如,使用map()匿名函数时)我有一个应用程序,其GUI将根据人体工程学原因重新制作.它是用PyGTK编写的,我想知道是否应该切换到PyQt来缓解未来的发展.
这个应用程序主要是带有按钮,工具栏,对话框等的经典UI,但也有一些特定的要求:我当然需要创建一个基于treeview/tableview的自定义小部件(制作类似电子表格的小部件),这个应用程序有一个许多更新GUI的工作线程.
我正在就这两点寻求建议:
我有四个类(A,B,C和D经典的金刚石图案和以下)Container含有类unique_ptr<A>.我想使用谷物序列化库序列化这些类.
struct A {int f1; int f2; int f3}
struct B : public virtual A {
template<typename Archive>
inline void save(Archive& ar) const {
std::cerr << "Saving Obj: " << this << std::endl;
std::cerr << "This: " << &(this->f1) << " "
<< &(this->f2) << " " << &(this->f3) << std::endl;
std::cerr << "This: " << this->f1 << " "
<< this->f2 << " " << …Run Code Online (Sandbox Code Playgroud) 我使用SIMD指令运行一系列计算。这些指令返回一个16字节的向量,结果为compare,每个字节为0x00或0xff:
0 1 2 3 4 5 6 7 15 16
compare : 0x00 0x00 0x00 0x00 0xff 0x00 0x00 0x00 ... 0xff 0x00
Run Code Online (Sandbox Code Playgroud)
设置为字节的0xff意思是我需要以do_operation(i) i作为字节的位置来运行该函数。
例如,上述compare向量意味着,我需要运行以下操作序列:
do_operation(4);
do_operation(15);
Run Code Online (Sandbox Code Playgroud)
这是到目前为止我想到的最快的解决方案:
for(...) {
//
// SIMD computations
//
__m128i compare = ... // Result of SIMD computations
// Extract high and low quadwords for compare vector
std::uint64_t cmp_low = (_mm_cvtsi128_si64(compare));
std::uint64_t cmp_high = (_mm_extract_epi64(compare, 1));
// Process low quadword …Run Code Online (Sandbox Code Playgroud) 给定一个Scala collection.SortedMap和一个键k,获得所有键(甚至更好,所有键值对)的最有效方法是什么,而不是存储在有序映射中.返回的键集应保留键的顺序.当然,我想避免仔细阅读整个数据结构(即使用),并利用地图的排序这一事实.kfilterKeys
我想做的事情如下:
val m = collection.SortedMap((1,1) -> "somevalue", (1,2) -> "somevalue",
(1,3) -> "somevalue", (2,1) -> "somevalue", (3,1) -> "somevalue")
m.getKeysGreaterThan((2,1))
// res0: scala.collection.SortedSet[(Int, Int)] = TreeSet((2,1), (3,1))
Run Code Online (Sandbox Code Playgroud)
如果您能想到更合适的类似地图的数据结构,请提出建议.
c++ ×2
scala ×2
cereal ×1
inheritance ×1
intrinsics ×1
optimization ×1
polymorphism ×1
pygtk ×1
pyqt4 ×1
python ×1
simd ×1
sse ×1