C++和Java容器内存消耗占用比较

发布于:2024-05-04 ⋅ 阅读:(164) ⋅ 点赞:(0)

事情起因:Java端占用内存高,将一堆数据表属性map存起来来,同样的属数据load进Java内存和

C++内存大小差几倍,遂做如下测试:

测试c++ vector,map 与Java List,Map内存占用比较:

C++代码:

测试c++ vector,map 与Java List,Map内存占用比较
C++GS_TEST(LoadMemoryTest2, LoadMemoryTest, LoadMemoryTest, 20240429)
{
	std::vector<int> sds;
	for (int i = 0; i < 10000000; i++)
		sds.push_back(i);
	std::cout << sds.size() << "--"  << std::endl;
}
GS_TEST(LoadMemoryTest3, LoadMemoryTest, LoadMemoryTest, 20240429)
{
	std::map<string, string> attributes;
	std::vector<int> sds;
	for (int i = 0; i < 10000000; i++)
		attributes[GsStringHelp::ToString(i).c_str()] = GsStringHelp::ToString(i).c_str();
	std::cout << sds.size() << "--" << std::endl;
}

GS_TEST(LoadMemoryTest4, LoadMemoryTest, LoadMemoryTest, 20240429)
{
	std::map<string, GsAny> attributes;
	std::vector<int> sds;
	for (int i = 0; i < 10000000; i++)
		attributes[GsStringHelp::ToString(i).c_str()] = GsAny(i);
	std::cout << sds.size() << "--" << std::endl;
}

Java:

public static void testarray()
{
	ArrayList<Integer> data = new 	ArrayList<>();
	for (int i = 0; i < 10000000; i++)
		data.add(i);
	System.console().printf(""+data.size());
}

public static void testarray2()
{
	int[] data = new 	int[10000000];
	for (int i = 0; i < 10000000; i++)
		data[i]=i;
	System.console().printf(""+data.length);
}


public static void testarrayLinkedList()
{
	LinkedList<Integer> data = new 	LinkedList<>();
	for (int i = 0; i < 10000000; i++)
		data.add(i);
	System.console().printf(""+data.size());
}
public static void testarrayVector()
{
	Vector<Integer> data = new 	Vector<>();
	for (int i = 0; i < 10000000; i++)
		data.add(i);
	System.console().printf(""+data.size());
}
public static void testarray3HashMap()
{
	HashMap<String, String> attributes = new HashMap<>();

	for (int i = 0; i < 10000000; i++)
	{
		attributes.put( String.valueOf(i), String.valueOf(i));
	}
	System.console().printf(""+attributes.size());
}
public static void testarray3LinkedHashMap()
{
	LinkedHashMap<String, String> attributes = new LinkedHashMap<>();

	for (int i = 0; i < 10000000; i++)
	{
		attributes.put( String.valueOf(i), String.valueOf(i));
	}
	System.console().printf(""+attributes.size());
}

public static void testarray3TreeMap()
{
	TreeMap<String, String> attributes = new TreeMap<>();

	for (int i = 0; i < 10000000; i++)
	{
		attributes.put( String.valueOf(i), String.valueOf(i));
	}
	System.console().printf(""+attributes.size());
}

public static void testarray3HashMapany()
{
	HashMap<String, GsAny> attributes = new HashMap<>();

	for (int i = 0; i < 10000000; i++)
	{
		attributes.put( String.valueOf(i), new GsAny(i));
	}
	System.console().printf(""+attributes.size());
}

最终比试结果统计:

语言

工作集内存(起始->完成)

峰值内存(起始->完成)

Java(ArrayList<Integer>)

31M->328M

34M->328M

Java(int[])

31M->70M

34M->70M

Java(LinkedList<Integer>)

34M->584M

34M-584M

Java(Vector<Integer>

34M->290M

34M->290M

Java(LinkedHashMap<String, String>)

34M->2365M

34M->2365M

Java(TreeMap<String, String>)

34M->2002M

34M->2002M

Java(HashMap<String, Object>)

31M->2112M

34M->2112M

Javav(HashMap<String, GsAny>)

45M->2593M

45M->2593M

C++(std::vector<int>)

19M->59M

23M->82M

C++(std::map<string, std::string>)

19M->1116M

23M->1116M

C++(std::map<string, GsAny>)

19M->959M

23M->959M

结论:

  1. C++ vector<int>内存消耗与Java原生类型数组int[]消耗相当(C++多一点是动态扩容会多扩)
  2. Java map存储多消耗2倍多 , ArrayList比std::vector多耗4倍多, 猜测原因Java容器中只能存对象, 有额外装箱和拆箱消耗内存

网站公告

今日签到

点亮在社区的每一天
去签到