`
zuoge85
  • 浏览: 79632 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

伪共享测试

    博客分类:
  • java
阅读更多

引用来自于 http://ifeve.com/falsesharing/

 

下面是我的实现

总结下,伪共享在cpu物理线程(超线程影响较少)越多的情况下对性能影响越大

而且在调用次数较少的情况下影响不大,因此不应该对伪共享引起的性能下降过多关注

如果你只有cpu核心少于4个就不要测试了.

 

测试时候注意jvm参数,cg会影响测试结果!同样cpu的睿频也会影响结果!

jvm是否把对象分配在一个缓存行中是无法保证的,所以我们只能理解连续分配的内存有很大的可能在一个缓存行中!

 

我的jvm参数

-server -verbose:gc -Xms1500m -Xmx2024m

 

 

package io.grass.core.collect;

import io.grass.util.StringUtils;
import io.grass.util.TimeSpan;



/**
 * jvm参数 !-server -verbose:gc -Xms1500m -Xmx2024m
 * 注意gc对垃圾回收的影响
 * @author zuoge85
 *
 */
public class FalseSharingTest {
	private static final int TEST_NUMS = 100000000;
	private static final int THREAD_NUMS = 4;

	public static void main(String[] args) throws InterruptedException {
		//测试伪装共享
		test1();
		System.out.println(StringUtils.center("sb", 90, '*'));
		test2();
	}
	static LongWarp[] longs = new LongWarp[THREAD_NUMS];
	static LongWarpPadded[] longPaddeds = new LongWarpPadded[THREAD_NUMS];
	static{
		for (int j = 0; j < THREAD_NUMS; j++) {
			longs[j] = new LongWarp();
		}
		for (int j = 0; j < THREAD_NUMS; j++) {
			longPaddeds[j] = new LongWarpPadded();
		}
	}
	public static void test1() throws InterruptedException{
		Thread[] ts=new Thread[THREAD_NUMS];
		
		for (int i = 0; i < ts.length; i++) {
			final int n = i;
			ts[i] = new Thread(){
				 public void run() {
					 TimeSpan ts = new TimeSpan();
					for (int j = 0; j < TEST_NUMS; j++) {
						 longs[n].setI(longs[n].getI()+1);
					}
					String end = ts.end();
					System.out.println("Thread"+n+":\t"+end+";end value:"+ longs[n]);
		         }
			};
		}
		for (int i = 0; i < ts.length; i++) {
			ts[i].start();
		}
		for (int i = 0; i < ts.length; i++) {
			ts[i].join();
		}
	}
	
	public static void test2() throws InterruptedException{
		Thread[] ts=new Thread[THREAD_NUMS];
		//final int[] ints = new int[THREAD_NUMS*1000];
		for (int i = 0; i < ts.length; i++) {
			final int n = i;
			ts[i] = new Thread(){
				 public void run() {
					TimeSpan ts = new TimeSpan();
					for (int j = 0; j < TEST_NUMS; j++) {
						longPaddeds[n].setI(longPaddeds[n].getI()+1);
					}
					String end = ts.end();
					System.out.println("Thread"+n+":\t"+end+";end value:"+ longPaddeds[n]);
		         }
			};
		}
		for (int i = 0; i < ts.length; i++) {
			ts[i].start();
		}
		for (int i = 0; i < ts.length; i++) {
			ts[i].join();
		}
	}
	public static class LongWarp{
		private volatile long i;

		public long getI() {
			return i;
		}

		public void setI(long i) {
			this.i = i;
		}

		@Override
		public String toString() {
			return "LongWarp [i=" + i + "]";
		}
	}
	 public static long sumPaddingToPreventOptimisation(final int index)
	 {
		 LongWarpPadded v = longPaddeds[index];
	      return v.p1 + v.p2 + v.p3 + v.p4 + v.p5 + v.p6;
	}

	public static class LongWarpPadded{
		private volatile long i;
		public  long p1, p2, p3, p4, p5, p6 = 7L;
		public long getI() {
			return i;
		}

		public void setI(long i) {
			this.i = i;
		}

		@Override
		public String toString() {
			return "LongWarpPadded [i=" + i + ", p1=" + p1 + ", p2=" + p2
					+ ", p3=" + p3 + ", p4=" + p4 + ", p5=" + p5 + ", p6=" + p6
					+ "]";
		}
		
	}
}





package io.grass.util;

import java.text.NumberFormat;

/**
 * 测试时间
 * 
 * @author zuoge85
 * 
 */
public class TimeSpan {
	public TimeSpan(){
		nf.setParseIntegerOnly(false);
		nf.setGroupingUsed(false);
		nf.setMaximumFractionDigits(6);
		nf.setMaximumFractionDigits(6);
		start();
		avgTime = System.nanoTime();
	}
	private long time;
	private long avgTime;
	public TimeSpan start() {
		time = System.nanoTime();
		return this;
	}
	private NumberFormat nf = NumberFormat.getNumberInstance();
	public String end() {
		return nf.format((System.nanoTime() - time) / 1000000000d);
	}
//	/**
//	 * 平均时间
//	 * @param i
//	 * @return
//	 */
//	public String avg(int i) {
//		return nf.format((System.nanoTime() - avgTime)/i / 1000000000d);
//	}
}

 

分享到:
评论

相关推荐

    如何利用Geoserver将矢量数据发布成伪3D服务文章的测试数据

    7. **测试服务**:发布服务后,可以通过Geoserver的预览功能或任何支持WMS/WMTS的客户端(如QGIS、OpenLayers等)来查看和验证发布的伪3D效果。 8. **优化性能**:如果数据量大,可能需要考虑缓存策略,如使用WMTS...

    椭圆曲线伪随机序列生成器

    - **码分多址 (CDMA)**:利用伪随机序列作为地址码,实现多用户共享同一频带的功能。 - **软件测试**:生成的伪随机序列可用于测试软件系统的稳定性和性能。 - **序列密码**:密钥流的随机性和不可预测性是决定序列...

    伪分布式的搭建过程

    总结来说,伪分布式Hadoop搭建是一个涉及环境配置、文件修改和服务启动的过程,它为开发者提供了一个在单机上模拟分布式计算的平台,便于学习和测试Hadoop的相关功能。通过这个过程,我们可以深入了解Hadoop的工作...

    redis 单机的伪集群工具资源

    然而,正式的 Redis 集群配置相对复杂,对于测试或学习目的,我们可以通过一些伪集群工具来模拟多节点环境。标题中的“redis 单机的伪集群工具资源”指的就是这样一种解决方案,它能在单台机器上模拟出多个独立的 ...

    hadoop2.6.5伪分布式搭建

    【Hadoop 伪分布式搭建详解】 ...完成以上步骤后,你应该已经成功搭建了一个 Hadoop 2.6.5 的伪分布式环境,可以开始进行 Hadoop 相关的开发和测试工作。在实际环境中,确保对所有配置进行详细检查,以避免潜在的问题。

    ABB双语言共享充电宝投资理财源码/共享充电宝系统源码

    ABB双语言共享充电宝投资理财源码/五级分销返利+地图显示模式/vue编译后前端 测试环境:Linux系统CentOS7.6、宝塔、PHP7.3、MySQL5.6,根目录public,伪静态laravel5

    prbs.rar_PRBS产生_prbs_vhdl_伪随机_伪随机序列

    这个程序可能是一个自同步PRBS发生器,能够生成连续的伪随机二进制序列,用于测试或仿真目的。"不记得在哪个论坛上下的"这句话暗示这是一个开源项目或者社区共享的资源,可能经过了其他用户的修改和优化。 【标签】...

    Hadoop单机伪分布式安装

    Hadoop单机伪分布式安装 Hadoop 是一个开源的大数据处理框架,由 Apache 软件基金会开发和维护。Hadoop 的核心组件包括 HDFS(Hadoop Distributed File System)、MapReduce 和 YARN(Yet Another Resource ...

    UrlReWrite(Url重写或伪静态)完美示例源码

    描 述:UrlReWrite(Url...然而这对于我们,没有很多的资金或使用的共享服务器,使得以上的方法都不是最佳的解决方案。幸而ASP.NET给我们提供了强大的可扩展性,能让我们自己定义页面的访问规则,很方便实现URL重写。

    thinkphp小说文学类自动采集+智能伪原创系统

    在这个系统中,可以设置多个小说文学类网站,统一管理,共享资源,提升整体流量。 3. **小说系统**:这是专为小说类内容设计的管理系统,包括但不限于小说分类、章节管理、用户评论、排行榜等功能,旨在提供一个...

    JAVA-缓存行对齐测试方法

    2. **缓存冲突**:如果两个线程分别修改不同对象的相邻成员变量,它们可能位于同一缓存行,导致每次写操作都会使另一线程的缓存失效,这称为伪共享(False Sharing)。这会导致不必要的缓存刷新和额外的通信开销,...

    射频测试规范.pdf

    DPCCH(高速专用物理控制信道)、HS-PDSCH(高速物理下行共享信道)、HS-SCCH(高速共享控制信道)、Iblocking()等。 通过了解这些缩略语和术语,可以更好地理解WCDMA射频测试的技术要求和测试方法,提高WCDMA...

    iocp udp 本机基准测试程序

    rupd_context的),防止出现多核机器上出现伪共享问题. 在自己机器上测试速度稳定达到16Gbit,叫上一版本较稳定(上一版本有较大波动). thread context switch 平局值在5W次左右,比起之前的20W此有非常大的提升,可以...

    zookeeper3.4.6+window伪分布式集群

    这通常是为了学习和测试目的,因为完全分布式集群在本地开发环境中可能会比较复杂。在伪分布式模式下,所有的Zookeeper服务都运行在同一台机器上,但每个服务都有独立的数据存储和配置,这样可以模拟多节点的交互...

    iocp udp 分布式队列无同步多核测试

    还没有测试的是chche伪共享造成的性能下降,在后面将测试. 设置代码中 DEFAULT_RUDP_BUFFER_SIZE = 32k(实际udp包远没有这么大),用vc6及vc8编译,在我的机器:thinkpad x200,(2.56G双核cpu,4G DDR3内存),win7 旗舰版,...

    wcdma原理及测试

    多个小区可以共享频谱资源,实现高效利用。 3. **控制平面与用户平面**: 控制平面处理信令和控制信息,用户平面则承载用户数据,两者分离设计,提高网络效率。 **三、WCDMA测试方法** 1. **网络性能测试**: 包括...

Global site tag (gtag.js) - Google Analytics