आप केवल पैटर्न मैच:
Foo = fun ([X]) -> X;
([X,Y]) -> {X,Y}
end
मैं भी उत्सुक प्रदर्शन को देखने के लिए नहीं था, इसलिए मैं बेंच मार्किंग का शीघ्रता से जाने के लिए किया था:
Foo = fun ({x,y}) -> one;
({a,b}) -> two
end
तुम सिर्फ एक सूची को स्वीकार कर सकता है यह। यह बिल्कुल सही नहीं है, और इसका इरादा केवल यह होना चाहिए कि वास्तव में क्या हो सकता है, और वास्तव में किसी को औसत, मानक विचलन, औसत, न्यूनतम और अधिकतम गणना करना चाहिए, लेकिन मैंने 1,000,000 कॉल करने के लिए न्यूनतम समय चुना।
-module(foo).
-export([run/1, norm1/0, norm2/0, norm3/0, norm4/0, list1/0, list2/0, list3/0, list4/0]).
-define(COUNT, 1000000).
run(F) ->
T = lists:foldl(
fun(_,Min) ->
T = ?MODULE:F(),
if T < Min -> T; true -> Min end
end,
?MODULE:F(),
lists:seq(1,99)
),
T
.
norm1() ->
Foo = fun(N) -> N * N end,
{T,_} = timer:tc(fun() ->
lists:map(fun(A) -> Foo(A) end, lists:seq(1,?COUNT))
end),
T
.
norm2() ->
Foo = fun(N, M) -> N * M end,
{T,_} = timer:tc(fun() ->
lists:map(fun(A) -> Foo(A,A) end, lists:seq(1,?COUNT))
end),
T
.
norm3() ->
Foo = fun(M, N, M) -> N * M end,
{T,_} = timer:tc(fun() ->
lists:map(fun(A) -> Foo(A,A,A) end, lists:seq(1,?COUNT))
end),
T
.
norm4() ->
Foo = fun(N, M, N, M) -> N * M end,
{T,_} = timer:tc(fun() ->
lists:map(fun(A) -> Foo(A,A,A,A) end, lists:seq(1,?COUNT))
end),
T
.
list1() ->
Foo = fun([N]) -> N * N end,
{T,_} = timer:tc(fun() ->
lists:map(fun(A) -> Foo([A]) end, lists:seq(1,?COUNT))
end),
T
.
list2() ->
Foo = fun([N, M]) -> N * M end,
{T,_} = timer:tc(fun() ->
lists:map(fun(A) -> Foo([A,A]) end, lists:seq(1,?COUNT))
end),
T
.
list3() ->
Foo = fun([_, N, M]) -> N * M end,
{T,_} = timer:tc(fun() ->
lists:map(fun(A) -> Foo([A,A,A]) end, lists:seq(1,?COUNT))
end),
T
.
list4() ->
Foo = fun([_, _, N, M]) -> N * M end,
{T,_} = timer:tc(fun() ->
lists:map(fun(A) -> Foo([A,A,A,A]) end, lists:seq(1,?COUNT))
end),
T
.
यह परिणाम है::
मैं इस कोड का इस्तेमाल किया
1> foo:run(norm1).
44820
2> foo:run(norm2).
48959
3> foo:run(norm3).
50328
4> foo:run(norm4).
50402
5>
5> foo:run(list1).
50463
6> foo:run(list2).
58948
7> foo:run(list3).
60829
8> foo:run(list4).
86604
9>
प्रदर्शन जाहिर है, कितनी देर सूची है पर निर्भर करने के रूप में एक उम्मीद होती है, क्योंकि यह करने के लिए किया जा रहा है सूची के माध्यम से काम करते हैं, और जुर्माना एक सामान्य कॉल से अधिक है।
प्रदर्शन अंतर मेरे लिए इतना अच्छा नहीं लग रहा है कि कम से कम यदि आप सही सूचियों के बारे में चिंता करते हैं, तो कम से कम, यदि आपको अपनी सूचियों में बहुत अधिक तर्क होने की उम्मीद नहीं है!
आप केवल पैटर्न मिलान के लिए ऐसा कर सकते हैं, यानी 'Foo = fun ({x, y}) -> एक; ({ए, बी}) -> दो छोर ', मैं ऐसा नहीं सोच सकता कि आप जो भी चाहते हैं वह कर सकते हैं जब तक कि आप केवल एक सूची स्वीकार नहीं करते हैं, जैसे' Foo = fun ([X]) -> X; ([एक्स, वाई]) -> {एक्स, वाई} एंड ',' फू ([ए]) 'और' फू ([ए, बी]) ', आदि को बुला रहा है। – Michael
हाँ, एक सूची स्वीकार करने के अलावा मुझे कुछ भी नहीं मिला। वास्तविक दुनिया की स्थिति में पारित किए गए प्रत्येक चर अलग-अलग चीजें हैं, इसलिए एक विकल्प एक प्रोपलिस्ट पास करना होगा (मैं _think_ यह एक मूर्खतापूर्ण मानचित्र है, मैं एरलांग के लिए नया हूं) और इसे इस तरह से करें। अगर आप मिठाई मीठा कर्म चाहते हैं तो अपनी टिप्पणी को उत्तर दें: पी – SCdF
यह वास्तव में एक बहुत ही रोचक सवाल है, मैंने कभी इस बारे में देखा या सोचा नहीं ... – Michael