2011-08-21 7 views
5

Yani ben denedim:Yükseltme asio soketi: dosyayı sabit diskten okumak için en hızlı yol?

int buff_length = 8192; 
ifstream stream; 
char* buffer = new char[buff_length]; 

stream.open(path.string().c_str(), ios::binary); 

boost::system::error_code ignored_error; 

while (stream) 
{ 
    stream.read(buffer, buff_length); 
    boost::asio::write(*socket, boost::asio::buffer(buffer, stream.gcount()), 
          boost::asio::transfer_all(), ignored_error); 
} 

ben bunu nasıl merak - nasıl daha hızlı yapmak?

uygulamam, Windows, Linux ve Mac OS üzerinde çalışmak zorundadır. İşte bu yüzden çok fazla kullanıyorum. Test için ab kullanıyorum. Dosyaları okumak ve göndermek için 2 veya en az 1,5 kat daha hızlı olmak istiyorum. Boost olabilir :: Iostream bana nasıl yardımcı olabilir? Ne optimize etmeye çalışıyorsanız bir soket üzerinde diskten bir dosya gönderme ise, Linux üzerinde iseniz

+0

Bir seferde kaç dosya gönderirsiniz (birbiri ardına)? Dosyalarınız genellikle ne kadar büyük? –

cevap

0

, sendfile(2) göz atın. Bu amaç için özel olarak tasarlanmıştır.

daha şimdi ne var gibi bir şey ile sopa istiyorsanız, ancak ayarlama yapın, ben tampon yerine sadece 8 KB'den megabayt az sayıda olması yapma çalışacaktı. Zaten TransmitFile sarılı olan

+1

'sendfile' Windows eşdeğerdir [' TransmitFile'] (http://msdn.microsoft.com/en-us/library/ms740565%28v=VS.85%29.aspx) – Hasturkun

+0

MACOSX sendfile yelpaze mi? – Rella

+0

@Kabumbus: nasıl http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/sendfile.2.html –

0

boost :: asio şunlara bakın peşinde olduğunuz ama belleğe dosyayı eşleyebilir dosyaların hızlı okuma ilgili sorunuza ne example

+1

Bu örneğin Windows'a özgü olduğunu unutmayın. –

1

tam olarak emin değiliz.

Bu şekilde, disk yerine bellekten okudunuz. Dosya boyutuna bağlı olarak ve böyle ilginç olabilecek farklı yaklaşımlar vardır, örn. Eğer küçük bir dosya varsa, tüm dosyayı eşleyin veya dosya bölgelerini dosya boyunca dosya olarak geniş bir dosya olarak işleyin.

Boost.Interprocess size bu here hakkında daha fazla bilgi bulabilirsiniz.

İlgili konular