0 0

自己写的数据缓冲池0

出于某个原因需要自己实现网络缓冲池的效果,用来缓存视频流数据的。想问一下这样的做法可不可行,不知道效率怎么样,是否合格。因为是缓存网络视频流数据,就担心性能和消耗问题,求指导。实现就两个方法,一个写一个读,为了模拟整个操作所以写了两个线程来执行。
public class TestByteBuffer {

	private ByteBuffer recBuffer = ByteBuffer.allocate(1024);

	/**
	 * @param args
	 * @throws InterruptedException
	 */
	public static void main(String[] args) throws InterruptedException {
		TestByteBuffer tbb = new TestByteBuffer();
		InData id = new InData(tbb.recBuffer);
		OutData od = new OutData(tbb.recBuffer);
		id.start();
		Thread.sleep(5);
		od.start();
		Thread.sleep(5000);
		id.setCycle(false);
		od.setCycle(false);
	}

}

class InData extends Thread {
	private String str = "LinkedList<ByteBuffer> recLL = new LinkedList<ByteBuffer>()";
	protected int i = 0;
	private ByteBuffer recBuffer;
	private int incomeSize;
	private byte[] ss = null;
	private boolean cycle = true;

	public InData(ByteBuffer recBuffer) {
		this.recBuffer = recBuffer;
	}

	@Override
	public void run() {
		System.out.println("input start");
		long st = System.currentTimeMillis();
		long et = 0;
		while (cycle) {
			ss = ("count " + i++ + " : " + str).getBytes();
			incomeSize = ss.length;
			if (incomeSize == 0) {
				return;
			}
			if (incomeSize > recBuffer.remaining()) {
				if (recBuffer.remaining() == 0) {
					recBuffer.position(0);
				} else {
					incomeSize = recBuffer.remaining();
				}
			}
			try {
				recBuffer.put(ss, 0, incomeSize);
			} catch (Exception e) {
				System.out.println("exception in InData");
				break;
			}
		}
		et = System.currentTimeMillis() - st;
		System.out.println("cycle " + i + " times in " + et);
		System.out.println("read : " + (i / et) + "/sec");
	}

	public boolean isCycle() {
		return cycle;
	}

	public void setCycle(boolean cycle) {
		this.cycle = cycle;
	}
}

class OutData extends Thread {
	private ByteBuffer recBuffer;
	private int writePosition;
	private int writeSize;
	private ByteBuffer sendBuffer = ByteBuffer.allocate(48);
	private boolean cycle = true;
	private int i = 0;

	public OutData(ByteBuffer recBuffer) {
		this.recBuffer = recBuffer;
	}

	@Override
	public void run() {
		System.out.println("output start");
		long st = System.currentTimeMillis();
		long et = 0;
		while (cycle) {
			i++;
			if (writePosition == recBuffer.limit()) {
				writePosition = 0;
				writeSize = sendBuffer.limit();
			} else {
				if ((writePosition + sendBuffer.limit()) > recBuffer.limit()) {
					writeSize = recBuffer.limit() - writePosition;
				} else {
					writeSize = sendBuffer.limit();
				}
			}
			try {
				System.arraycopy(recBuffer.array(), writePosition,
						sendBuffer.array(), 0, writeSize);
				System.out.println(new String(sendBuffer.array()));
			} catch (Exception e) {
				System.out.println("exception in OutData");
				e.printStackTrace();
				break;
			}
			// System.out.println(new String(sendBuffer.array()));
			writePosition += writeSize;
		}
		et = System.currentTimeMillis() - st;
		System.out.println("cycle " + i + " times in " + et);
		System.out.println("write : " + (i / et) + "/sec");
	}

	public boolean isCycle() {
		return cycle;
	}

	public void setCycle(boolean cycle) {
		this.cycle = cycle;
	}
}
2012年10月10日 15:59
目前还没有答案

相关推荐

    操作系统缓冲池模拟和实现(C++版)

    操作系统中的缓冲池是一种重要的内存管理机制,主要用于优化数据的读写效率。在操作系统设计中,缓冲池被用来存储和管理临时的数据,以便于减少I/O操作的次数,提高系统性能。本项目是基于C++语言实现的一个操作系统...

    操作系统-缓冲池的模拟使用

    这三个队列分别用于存储空闲的缓冲区、等待处理的数据缓冲区以及已完成处理待输出的数据缓冲区。 - **空缓冲队列(EMQ)**:初始状态下,所有缓冲区都位于此队列中,当有数据需要读取或写入时,系统会从此队列中...

    DB2缓冲池和索引调优的方法

    缓冲池是通过表空间与数据表发生联系的,数据表存放在指定的表空间中,每个表空间又有指定的缓冲池。 在 *unix 下,可以使用以下命令查看缓冲池相关信息: * 切换到 db2inst1 账号:su – db2inst1 * 连接到 exoa ...

    操作系统模拟:缓冲池

    缓冲池是一种内存管理策略,它为多个并发进程提供共享的缓存区域,用于存储数据,以提高系统效率和性能。在本项目中,我们用Java编程语言实现了缓冲池的模拟,旨在理解和学习操作系统的相关机制。 缓冲池的主要目标...

    I/O缓冲池演示程序

    总的来说,I/O缓冲池是系统优化的重要工具,通过有效地管理内存中的数据缓冲,能够显著提升系统的I/O性能。对于开发人员来说,理解和掌握I/O缓冲池的原理及实现,有助于编写出更加高效和稳定的程序。通过分析和实践...

    DB2缓冲池和索引调优的方法.doc

    缓冲池是 DB2 中的一块区域,用于存放频繁访问的数据,以提高数据库的性能。索引是 DB2 中的一种数据结构,用于快速定位数据。缓冲池和索引的调优可以显著地提高 DB2 的性能。 一、DB2 缓冲池的概念和作用 缓冲池...

    非常实用的缓冲池类vc++

    在C++编程中,缓冲池(Buffer Pool)是一种优化内存管理的技术,主要目的是减少系统...通过查看和学习这些内容,开发者可以了解如何在自己的VC++项目中实现或集成这个缓冲池类,从而优化内存管理,提升程序运行效率。

    缓冲池的简单模拟-操作系统课程设计

    缓冲池的设计目的是为了在多个进程或线程之间共享数据,通过缓存数据来优化数据传输,降低磁盘和内存之间的数据交换频率。在这个"缓冲池的简单模拟-操作系统课程设计"中,开发者使用了VC++作为编程环境,创建了一个...

    内存缓冲池的实现

    内存缓冲池是一种优化内存分配和释放的技术,它通过预先分配一大块内存并将其划分为多个固定大小的小块来提供高效的服务。在本文中,我们将详细探讨如何实现内存缓冲池,特别是采用多级链表的方式。 1. **多级链表...

    缓冲池实现

    当从一个源文件读取数据时,写线程将数据放入缓冲池;同时,接收方的读线程可以从缓冲池中取出数据,而不必等待每次传输的完整数据块。这样可以显著减少等待时间和网络拥塞,提高整体传输效率。对于本地文件复制,...

    DB2的表空间和缓冲池

    2. **缓冲池类型**:可以根据数据的不同特性来定义不同类型(例如,用于常规数据、索引数据或临时数据的缓冲池)。 3. **置换策略**:当缓冲池空间不足时,用于确定哪些数据页面应该被替换出缓冲池的策略。 4. **...

    windows 缓冲池

    非分页缓冲池中的内存不会被交换到磁盘,因此常用于存储关键系统数据,如设备驱动程序的I/O请求结构。分页缓冲池则可以被交换到磁盘,通常用于用户模式应用程序和非关键的系统数据。 双缓冲技术是这个代码实现的一...

    用C实现的带缓冲池的虚拟Ext2文件系统

    项目中使用缓冲池缓存频繁访问的数据块,通过哈希表或链表管理,实现高效的缓存替换策略,如LRU(最近最少使用)。 4. **文件操作**: 包括创建文件、打开文件、写入文件、关闭文件等。这需要实现一系列的系统调用,...

    Delphi XE2 DataSnap 使用链接池、数据集池等池例子

    它提供了丰富的功能,包括数据传输、安全、事务处理以及资源管理,其中链接池和数据集池是提高性能和效率的重要机制。 **链接池(Connection Pooling)** 链接池是一种数据库连接管理策略,用于复用已存在的数据库...

    探讨Oracle数据缓冲区内部机制

    同时,当数据库完全缓冲时,多数据缓冲池的需求降低,DEFAULT缓冲池可以用于存储所有数据块。 为了监控和管理已分配的数据块,可以使用SQL查询来计算DBA_DATA_FILES和DBA_EXTENTS中的块数量,以及通过DBMS_ROWID...

    Oracle的数据缓冲区是如何工作

    在全缓冲状态下,DEFAULT缓冲池可以用于存储所有数据块,而多数据缓冲池的需求降低。 要估算数据库所需的数据块数量,可以通过查询DBA_DATA_FILES和DBA_EXTENTS视图得到。随着数据库规模的变化,必须确保相应增加db...

    缓冲池模拟及实现.docx

    缓冲池是操作系统中用于提高数据传输效率的重要机制,它通过预分配一组缓冲区供多个进程共享,从而减少I/O操作的等待时间,优化系统性能。本实验旨在让学生深入理解缓冲池的工作原理,并通过编程实现一个简单的缓冲...

    缓冲池模拟及实现.pdf

    缓冲池是一种在操作系统中用于管理共享资源的机制,它可以高效地处理并发进程之间的数据传输,提高系统性能。本实验旨在通过模拟实现缓冲池,让学生深入理解其工作原理和使用方法。 实验的核心在于设计并实现三个...

    [IBM]DB2_基础__表空间和缓冲池

    优化缓冲池可以提高数据库的整体性能,例如,通过调整缓冲池的大小以适应更大的数据页或增加缓冲池的数量以分散I/O负载。 在第2节中,我们将探讨如何将缓冲池和表空间组合以实现最佳性能。这可能涉及到为不同类型的...

    vc 实现 双列队缓冲池

    在VC++环境中,双列队缓冲池是一种常见的数据结构,用于高效管理内存资源,提高程序运行效率。双列队缓冲池通常由两个队列组成,一个用于分配内存块,另一个用于回收内存块,实现了内存的快速申请和释放。这种设计在...

Global site tag (gtag.js) - Google Analytics