我问这个问题,以确定哪种内存分配算法可以为性能关键应用程序(如游戏引擎或嵌入式应用程序)提供更好的结果.结果实际上取决于内存碎片的百分比和内存请求的时间决定性.
教科书中有几种算法(例如Buddy内存分配),但也有其他像TLSF.因此,关于可用的内存分配算法,哪一个是最快的并且导致更少的碎片.顺便说一句,垃圾收集者不应包括在内.
还请注意,这个问题不是关于分析,它只是为了找出给定要求的最佳算法.
不久,我将开始使用共享内存开发并行版本的网格细化算法.
该大学的一位教授指出,我们必须非常小心线程安全,因为编译器和stl都不是线程感知的.
我搜索了这个问题,答案取决于编译器(有些尝试有点线程感知)和平台(如果编译器使用的系统调用是否是线程安全的).
那么,在linux中,gcc 4编译器为new运算符生成线程安全的代码?
如果没有,解决这个问题的最佳方法是什么?也许锁定每个呼叫到新的运营商?
有人可以告诉我为什么会发生以下事情:
我有2台电脑:
我维护C++程序(msvc 2005 c ++编译),它只在服务器上运行得太慢,但在我的comp上却没有.
我进行了测量(GetThreadTimes等)并且肯定可以说是狭窄的地方 - 它的内存分配(new/malloc).它只发生在服务器上!
我可以声称它是由于内存碎片而发生的,因为第一次服务器程序实例工作正常,只有在数据重新加载到内存(1-1.5百万分配/释放)后才开始在allocs上失去时间.
如果由于两台计算机(我的comp和服务器)上的内存碎片而看到相同的行为,我不会感到惊讶,但我看到的是:1).在我的comp分配上需要约5%的时间(不完全但有些像这样)2).在服务器上,这些分配需要大约75%的时间
怎么会发生这种情况?什么可能会减慢服务器计算机上的C++分配速度,同时它可以用于我的工作站.哪里可能有区别?它可能与OS级内存管理功能有关吗?因为C++级别管理器在两种情况下都是一样的.
以下是两种配置:
1).我的电脑(其中alloc占用约5%):
OS Name: Microsoft Windows 7 Enterprise
OS Version: 6.1.7600 N/A Build 7600
OS Manufacturer: Microsoft Corporation
OS Configuration: Member Workstation
OS Build Type: Multiprocessor Free
Registered Owner: Windows User
Original Install Date: 16/09/2011, 19:37:43
System Boot Time: 05/04/2013, 11:58:11
System Model: 7304A58
System Type: x64-based PC
Processor(s): 1 Processor(s) Installed.
[01]: Intel64 Family 6 Model 23 Stepping 10 GenuineIntel ~2642 Mhz
Windows Directory: C:\Windows …Run Code Online (Sandbox Code Playgroud) 我目前正在评估一些可扩展的内存分配器,即nedmalloc和ptmalloc(都建立在dlmalloc之上),作为默认malloc/new的替代品,因为在多线程环境中存在明显的争用.他们公布的表现似乎很好,但是我想检查一下真正使用它们的其他人的经历.
我想评估Java线程功能。
我创建了一个没有线程的演示,如下所示:
import java.util.*;
public class NoThread {
public static void main(String[] args) {
NoThread Obj= new NoThread();
Date BeforeDate = new Date();
Obj.run();
Date AfterDate = new Date();
Double Time_Consume = (AfterDate.getTime()- BeforeDate.getTime())/1000.0;
System.out.println("Time Consume= " + Time_Consume + " Seconds" );
}
public void run() {
String tmp = "";
for (int i = 0; i < 100000; i++) {
tmp += i;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Cons
ole display: Time Consume= 4.771 Seconds
Run Code Online (Sandbox Code Playgroud)
我用线程创建了一个演示。
import java.util.Date;
public class …Run Code Online (Sandbox Code Playgroud)