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

文章对比了C++和Java中vector、map以及对应Java集合类(ArrayList、LinkedList、HashMap等)在处理大量数据时的内存占用,发现C++vector与Javaint[]内存消耗相近,而Javamap内存消耗显著高于C++,尤其是使用泛型时。
摘要由CSDN通过智能技术生成

事情起因: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容器中只能存对象, 有额外装箱和拆箱消耗内存
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值