challenge 分散関数呼び出し

分散関数呼び出しを実装してください.

呼び出される関数は,定価を整数で,割引率(%)を整数で受け取り,
文字列で「販売価格 ○円(定価○円から○%引き)」を返すものとします.
また,数字は3桁のカンマ区切りにするものとします.

たとえば,pricestring(2000, 20) なら
"販売価格 1,600円 (定価2,000円から20%引き)"
を返します.

関数の呼び出し元と,呼び出される側は,物理的に異なる
サーバに配置できることを条件とします.
呼び出し方法は問いませんが,呼び出し方法に名前がある場合,
それをタグに加えてください.
(XML-RPC,SOAP,CORBA,RMI,など)

また,作成した関数を直列に1万回呼び出して,
実行にかかった時間を測定してください.
測定時は別サーバでなくても構いません.
(なるべく別サーバが望ましいです)

測定環境として,
・サーバとクライアントのCPU・メモリ
・同一サーバ内での実行か別サーバでの実行か
・別サーバの場合,通信経路.(100Mbps Ethernet等)
・言語のバージョン
・ミドルウェアを使用している場合,その名前とバージョン
も併記してください.

1つの言語で複数の分散関数呼び出しの実装方法がある場合,
複数の回答を歓迎します.

出題の意図は,様々な分散呼び出し方法の実装例と,
レスポンス速度の確認にあります.
このお題は沢渡 みかげさんの投稿です。 まったく手を加えないでいい完成度の投稿で本当に助かります。 ありがとうございました。

Posted feedbacks - Objective-C

CPU: 1.83 GHz Intel Core Duo
メモリ: 2 GB
実行:  同一サーバ内
1万回の実行時間: 1.936秒
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//--------------------------------------------------------------------------------
//サーバ側のソースコード
//ソースファイルのエンコーディングはUTF-8にしてください
//--------------------------------------------------------------------------------

#import <Foundation/Foundation.h>

@interface Server : NSObject {
}
- (NSString*)priceString:(NSNumber*)listPrice :(NSNumber*)discount;
@end

@implementation Server
- (NSString*)insertComma:(unsigned)number {
	NSMutableString* result = [NSMutableString stringWithString:
			[[NSNumber numberWithUnsignedInt:number] stringValue]];
	
	int length = [result length];
	while ( length > 3 ) {
		length -= 3;
		[result insertString:@"," atIndex:length];
	}
	
	return result;
}

- (NSString*)priceString:(NSNumber*)listPrice :(NSNumber*)discount {
	NSString* format = [NSString stringWithUTF8String: "販売価格 %@円 (定価%@円から%d%%%%引き)"];
	
	unsigned unsignedListPrice = [listPrice unsignedIntValue];
	unsigned unsignedDiscount = [discount unsignedIntValue];
	unsigned unsignedRetailPrice = unsignedListPrice * ( 100 - unsignedDiscount ) / 100;
	
	NSString* listPriceString = [self insertComma:unsignedListPrice];
	NSString* retailPriceString = [self insertComma:unsignedRetailPrice];
	
	return [NSString stringWithFormat: format, retailPriceString, listPriceString, unsignedDiscount];
}
@end

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
	
	Server* server = [[[Server alloc] init] autorelease];
	NSConnection* connection = [NSConnection defaultConnection];
	[connection setRootObject:server];
	
	if ( [connection registerName:@"server"] )
		[[NSRunLoop currentRunLoop] run];
	
    [pool release];
    return 0;
}

//--------------------------------------------------------------------------------
//クライアント側のソースコード
//コンパイルオプション:-std=gnu99
//--------------------------------------------------------------------------------

#import <Foundation/Foundation.h>

@protocol ServerProtocol
- (NSString*)priceString:(NSNumber*)listPrice :(NSNumber*)discount;
@end

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
	
	NSDistantObject* distantObject = [NSConnection
			rootProxyForConnectionWithRegisteredName:@"server" host:nil];
	[distantObject setProtocolForProxy:@protocol(ServerProtocol)];
	
	NSNumber* listPrice = [NSNumber numberWithInt:2000];
	NSNumber* discount = [NSNumber numberWithInt:20];
	
	NSLog( @"start" );
	
	for ( int i = 0; i < 10000; i++ )
		[distantObject performSelector:@selector(priceString::) withObject:listPrice withObject:discount];
	
	NSLog( @"end" );
	
    [pool release];
    return 0;
}

Index

Feed

Other

Link

Pathtraq

loading...